Débogage d'une classe ToolValidator

Comme illustré ci-dessous, pour programmer une classe ToolValidator, cliquez avec le bouton droit sur votre outil, cliquez sur Propriétés, sur l'onglet Validation et enfin sur Modifier. Votre éditeur Python installé, tel qu'IDLE ou PythonWin, s'ouvre. Ajoutez votre code, enregistrez vos modifications, fermez l'éditeur, puis cliquez sur Appliquer ou OK dans le volet Validation.

Saisie du code ToolValidator

Lorsque vous cliquez sur Appliquer ou OK, votre code ToolValidator est contrôlé pour repérer les erreurs de syntaxe. S'il l'une des méthodes de classe contient des erreurs de syntaxe, un message contenant une description de l'erreur s'affiche. Vous devez corriger l'erreur avant de pouvoir appliquer vos modifications. Outre la vérification des erreurs de syntaxe, la classe ToolValidator est initialisée, la méthode initializeParameters est appelée et les éventuelles erreurs d'exécution sont recherchées. Invoquer une méthode qui n'existe pas, comme la suivante, constitue une erreur d'exécution :

fc = self.params[0].Value  # Should be "value"

Les erreurs d'exécution dans les méthodes updateParameters et updateMessages apparaissent lorsque la boîte de dialogue de l'outil est ouverte et ces méthodes appelées. Les erreurs d'exécution s'affichent comme des erreurs dans le premier paramètre. Dans l'exemple ci-dessous, la méthode updateParameters contient une erreur typographique (par exemple, Valeu au lieu de Valeur) :

Affichage des erreurs d'exécution

Pour exécuter l'outil, vous devez modifier votre code ToolValidator et corriger l'erreur (dans ce cas, en modifiant Valeu en Valeur).

Utilisation de la fonction Describe

L'utilisation de la fonction Describe constitue une question importante.

AttentionAttention :

lors de l'utilisation de la fonction Describe, n'utilisez jamais la représentation de chaîne de la valeur.

Incorrect (fonction str utilisée)

  desc = arcpy.Describe(str(self.params[0].value))

Correct

  desc = arcpy.Describe(self.params[0].value)

Vous ne devez pas utiliser la représentation de chaîne pour les jeux de données (qui détermine le chemin d'accès du catalogue au jeu de données), car le jeu de données peut ne pas exister : il peut être une variable dérivée d'un modèle, et le modèle doit être exécuté avant que le jeu de données existe sur le disque. (Vous pouvez vérifier si un paramètre contient une variable dérivée à l'aide de la méthode parameter.isInputValueDerived.) Si vous utilisez la représentation de chaîne pour le jeu de données, la fonction Describe peut échouer si le jeu de données n'existe pas encore sur le disque.

Assurez-vous que votre paramètre a une valeur avant d'effectuer un test

Une erreur courante de codage ToolValidator consiste à ne pas effectuer de test pour les valeurs non initialisées.

Incorrect (La valeur n'est pas définie et arcpy.Describe échoue.)

  fc = self.params[0].value
  shapetype = arcpy.Describe(fc).shapeType.lower()

Correct (Test de la valeur préalable.)

  fc = self.params[0].value
  if fc:
    shapetype = arcpy.Describe(fc).shapeType.lower()

Débogage avancé

Même si votre classe ToolValidator ne contient pas d'erreurs de syntaxe ni d'exécution, des erreurs logiques sont susceptibles d'être présentes, par exemple des paramètres qui ne s'activent et ne se désactivent pas correctement, des valeurs par défaut qui ne sont pas calculées correctement ou la description en sortie qui n'est pas remplie correctement. En règle générale, deux techniques permettent de rechercher les erreurs logiques dans un outil de script :

Etant donné que le code ToolValidator est stocké avec l'outil et est exécuté uniquement lorsque la boîte de dialogue ou la ligne de commande est utilisée, ces deux techniques nécessitent une prise en charge spéciale dans ToolValidator.

Affichage des messages de débogage

Malheureusement, vous ne pouvez pas imprimer de messages dans ToolValidator : la directive d'impression Python n'a aucun effet, car il n'y pas d'endroit où écrire le message. L'utilisation des méthodes d'objet Parameter setErrorMessage et setWarningMessage pour afficher les messages de débogage s'avère problématique : vous pouvez uniquement les utiliser dans la méthode updateMessages, mais le message de débogage que vous voulez afficher a probablement été généré dans updateParameters et vous ne pouvez pas faire passer votre message de débogage entre les méthodes de classe dans ToolValidator.

Vous pouvez cependant utiliser cette astuce :

  • Ajoutez un nouveau paramètre de chaîne à votre outil. Définissez-le comme le dernier paramètre.
  • Dans updateParameters, écrivez votre message de débogage pour ce nouveau paramètre.
  • Ouvrez la boîte de dialogue de l'outil et indiquez des valeurs. Le message de débogage s'affiche dans le nouveau paramètre de chaîne.
  • Après avoir trouvé et corrigé le problème, supprimez le dernier paramètre de la liste de paramètres et toute utilisation de celui-ci dans votre code ToolValidator.

Le code suivant illustre cette procédure :

  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

Débogage dans un éditeur Python IDE

Dans certains cas, l'impression de messages de débogage ne suffit pas et vous devez déboguer votre code à l'aide d'un éditeur Python IDE (tel que IDLE ou PythonWin), en définissant des seuils, en parcourant votre code, en examinant les valeurs, puis en corrigeant les erreurs logiques.

Pour déboguer, créez un script autonome et déboguez-le dans votre éditeur. En haut du script, chargez la boîte à outils, créez le tableau de paramètres, puis définissez les valeurs de paramètre nécessaires, comme suit :

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"

Notez que arcpy.GetParameterInfo contient le nom de votre outil, et non l'étiquette. Cela permet au géotraitement de créer le tableau de paramètres. Définissez ensuite un ou plusieurs paramètres dans le tableau.

Ajoutez à présent votre code ToolValidator. (Vous pouvez copier/coller le code directement à partir de la boîte de dialogue Propriétés.)

En bas de votre script, appelez ToolValidator de la façon suivante :

# Create the ToolValidator class and call updateParameters 
#   and/or updateMessages
#
validator = ToolValidator()
validator.updateParameters()

La structure de base de votre script autonome est la suivante (le code ToolValidator réel a été supprimé pour simplifier l'exemple) :

# 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()

7/10/2012