Estoy desarrollando una caja de herramientas de Python, y llegó a través de un comportamiento curioso: La herramienta de los objetos no recordar las variables de instancia entre llamadas a la función. Considere este código:
import arcpy
class Toolbox(object):
def __init__(self):
self.label = "Test"
self.alias = "Test"
self.tools = [Tool]
class Tool(object):
def __init__(self):
self.label = "Test tool"
self.x = "INIT"
def getParameterInfo(self):
param0 = arcpy.Parameter(
displayName = "Parameter",
name = "parameter",
datatype = "String",
parameterType = "Required",
direction = "Input")
return [param0]
def updateParameters(self, parameters):
self.x = "UPDATE PARAMETERS"
def updateMessages(self, parameters):
parameters[0].setWarningMessage(self.x)
self.x = "UPDATE MESSAGES"
def execute(self, parameters, messages):
arcpy.AddMessage(self.x)
La manera en que yo esperaría que este código se comportan es este:
- Primera
__init__
yx
se establece en"INIT"
. - A continuación,
updateParameters
yx
es cambiado a"UPDATE PARAMETERS"
. - A continuación,
updateMessages
se llama. Muestra un mensaje de alerta con el texto"UPDATE PARAMETERS"
y, a continuación, cambiex
a"UPDATE MESSAGES"
. - Finalmente, cuando se ejecuta la herramienta se emite
"UPDATE MESSAGES"
.
Sin embargo, cuando ejecuto la herramienta tanto de la advertencia y la salida de la ejecución es "INIT"
. Mi conclusión es que ArcMap no utilizar la misma instancia de la clase a lo largo, sino que crea una nueva instancia para cada llamada de función (updateParameters
, updateMessages
y execute
).
Es mi conclusión correcta? Si es así, ¿por qué ArcMap se comportan de esa manera? A partir de una programación orientada a objetos perspectiva parece muy extraño.
Este comportamiento provoca grandes problemas para mí. El primer parámetro de la herramienta que estoy desarrollando es un archivo de texto. Cuando el usuario ha elegido un quiero rellenar el resto de parámetros con diferentes valores por defecto en función del contenido del archivo. Dado que el archivo podría ser bastante grande, yo no quiero tener que analizar cada vez que los cambios en los parámetros, pero ahora parece que tengo que ya no hay manera de saber si el parámetro ha cambiado o no.