Отладка класса ToolValidator (Валидатор инструмента)
Как показано ниже, для программирования класса ToolValidator, щелкните правой кнопкой мыши на вашем инструменте, выберите Свойства (Properties), щелкните закладку Проверка (Validation), а затем нажмите Редактировать (Edit). Откроется установленный у вас редактор Python, либо IDLE либо PythonWin. Добавьте свой код, сохраните изменения, выйдите из редактора, а затем щелкните либо Применить (Apply), либо OK на панели Проверка (Validation).
Когда вы нажимаете Применить (Apply) или OK, происходит проверка вашего кода Валидатора инструментов на предмет синтаксических ошибок. Если в любом из методов имеются синтаксические ошибки, появится a сообщение с описанием синтаксической ошибки, и вы должны будете исправить эту ошибку прежде, чем применить сделанные изменения. Помимо проверки синтаксических ошибок, инициализируется класс Валидатора инструментов и производится проверка метода initializeParameters на ошибки времени выполнения. Пример ошибки времени выполнения запрашивает несуществующий метод, как показано ниже:
fc = self.params[0].Value # Should be "value"
Ошибки времени выполнения в методах updateParameters и updateMessages найдены при открытии диалогового окна и вызове этих методов. Ошибки времени выполнения показывают как ошибки в первом параметре. Это проиллюстрировано ниже; метод updateParameters содержит опечатку (например, Value вместо value):
Для выполнения этого инструмента вам необходимо отредактировать ваш код Валидатора инструментов (ToolValidator code) и исправить ошибку (в данном случае изменить Value на value).
Применение функции Описания (Describe)
Тонким, но важным вопросом является применение функции Описания.
При пользовании функцией Описания никогда не используйте строковое представление значений.
Неправильно (Incorrect) (применена str функция (str function used)
desc = arcpy.Describe(str(self.params[0].value))
Правильно
desc = arcpy.Describe(self.params[0].value)
Не следует использовать строковое представление для наборов данных (указывая путь в Каталоге к набору данных), потому что этот набор данных, возможно, не существует—это может быть производная переменная модели, и эта модель должна быть запущена до того, как набор данных существует на диске. (Вы можете проверить, содержит ли параметр переменную производной, методом parameter.isInputValueDerived .) Если вы используете строковое представление для набора данных, Описание (Describe) может не получиться, поскольку данный набор данных может еще не существует на диске.
Перед тестированием убедитесь в том, что ваш параметр имеет значение
Общая ошибка кодирования Валидатора инструментов (ToolValidator) не тестируется для не инициированных значений.
Некорректно (Incorrect) (Значение не установлено, arcpy.Describe (Описание) не удалось.)
fc = self.params[0].value
shapetype = arcpy.Describe(fc).shapeType.lower()
Корректно (Correct) (Вначале протестируйте на значение.)
fc = self.params[0].value
if fc:
shapetype = arcpy.Describe(fc).shapeType.lower()
Расширенная отладка
Даже при отсутствии у вашего класса Валидатора инструментов (ToolValidator) синтаксических ошибок и ошибок времени выполнения, у вас все еще могут быть логические ошибки, такие, как неправильное включение или неправильное отключение параметров, неправильное вычисление значений по умолчанию, или некорректное заполнение описания выходных данных. Традиционно, имеется два способа обнаружения логических ошибок в инструменте-скрипте:
- Распечатайте свои сообщения по отладке, используя принтер или функцию геообработки AddMessage.
- Пошагово просмотрите код отладчика.
Поскольку код Валидатора инструментов (ToolValidator) хранится вместе с инструментом и выполняется только тогда, когда используется диалоговая или командная строка, эти два способа требуют особого обращения с Валидатором инструментов (ToolValidator).
Отображение сообщений отладки
К сожалению, вы не сможете распечатать сообщения в Валидаторе инструментов—команда печати в Python не будет работать, поскольку негде писать сообщения. Использование методов объектов параметров setErrorMessage и setWarningMessage для отображения сообщений отладки проблематично—их вы можете использовать только в методе updateMessages, однако сообщение отладки, которое вы хотите отобразить, возможно, было создано в updateParameters, а способа передачи сообщений отладки между методами класса в Валидаторе инструментов (ToolValidator) не существует.
Однако, вы можете применить следующий прием.
- Добавьте в ваш инструмент новый строковый параметр. Сделайте его последним параметром.
- В updateParameters, напишите свое сообщение отладки в этот новый параметр.
- Откройте диалоговое окно инструмента и введите значения. В новом строковом параметре появится Сообщение отладки.
- После обнаружения и исправления ошибки удалите последний параметр из списка параметров и все что с ним связано в вашем коде Валидатора инструментов (ToolValidator).
Пример кода приводится ниже:
def updateParameters(self):
if self.params[0].value and not self.params[1].altered:
desc = arcpy.Describe(self.params[0].value)
fields = desc.fields
for field in fields:
fType = field.type.lower()
if fType == "smallinteger" or \
fType == "integer":
self.params[1].value = field.name
# Update our "debug" parameter to show
# the field type
#
self.params[2].value = fType
break
# No field, update "debug" parameter
#
self.params[1].value = ""
self.params[2].value = "No field found"
return
Отладка в Python EDE
В некоторых случаях недостаточно распечатать сообщения отладки, и вам будет необходимо отладить ваш код с помощью Python IDE (IDLE или PythonWin), установив точки разрыва, пройдя через ваш код (stepping through your code), осмотрев значения и исправив логические ошибки.
Для отладки создайте автономный скрипт и произведите его отладку в вашем редакторе. В верхней части скрипта загрузите набор инструментов, создайте массив параметра, а затем установите необходимые значения параметров, как описано ниже:
import arcpy
# Load the toolbox and get the tool's parameters, using the tool
# name (not the tool label).
#
arcpy.ImportToolbox("E:/Documents/Tool Validation Examples.tbx")
params = arcpy.GetParameterInfo("HotSpots_stats")
# Set required parameters
#
params[0].value = "D:/st_johns/city.mdb/roads"
Обратите внимание на то, что arcpy.GetParameterInfo содержит имя вашего инструмента, а не надпись. Это позволит геообработке создать массив параметра. После этого вы установите один или более параметров в массиве.
Теперь добавьте ваш код Валидатора инструментов (ToolValidator). Можно скопировать и вставить код непосредственно из диалогового окна Свойства (Properties).
В нижней части вашего скрипта вызовите Валидатор инструментов, как показано ниже:
# Create the ToolValidator class and call updateParameters
# and/or updateMessages
#
validator = ToolValidator()
validator.updateParameters()
Таким образом, структура вашего автономного скрипта в основном будет выглядеть следующим образом (актуальный код Валидатора инструментов был удален с целью упрощения примера):
# Create the parameter array and values
#
import arcpy
# Add the toolbox and fetch the parameter list
#
arcpy.ImportToolbox("E:/Documents/Tool Validation Examples.tbx")
params = arcpy.GetParameterInfo("HotSpots_stats")
params[0].value = "D:/st_johns/city.mdb/roads"
# ToolValidator class block
#
class ToolValidator:
def __init__(self):
import arcpy
self.params = arcpy.GetParameterInfo()
def initializeParameters(self):
# (initializeParameters code here)
return
def updateParameters(self):
# (updateParameters code here)
return
def updateMessages(self):
# (updateMessages code here)
return
# Call routine(s) to debug
#
validator = ToolValidator()
validator.updateParameters()
validator.updateMessages()