2010-08-15 3 views
4

Je suis un programmeur expérimenté, mais toujours un peu vert chez python. Je viens d'être coincé par une erreur d'indentation, ce qui m'a coûté beaucoup de temps de débogage. Je me demandais ce que les programmeurs python expérimentés font pour éviter de créer de tels problèmes en premier lieu.Quelles astuces utilisez-vous pour éviter d'être perturbé par la syntaxe des espaces python?

Voici le code (partie d'un programme beaucoup plus vaste):

class Wizvar(): 

    def select(self): 
     self.selected = True 

    def unselect(self): 
     self.selected = False 

     value = None 

Le problème est que la « valeur = Aucun » doit être outdented un niveau. Comme c'est le cas, la variable est clobée chaque fois que la méthode unselect est appelée, plutôt qu'une seule fois. J'ai regardé cela plusieurs fois sans voir ce qui n'allait pas.

Répondre

8

Placez tous les attributs de classe (par exemple, value) en haut, juste sous la déclaration class Wizvar (sous la chaîne doc, mais surtout les définitions de méthode). Si vous placez toujours les attributs de classe au même endroit, vous ne risquez pas de rencontrer cette erreur particulière aussi souvent.

Notez que si vous suivez la convention ci-dessus et avait écrit:

class Wizvar(): 
     value = None 

    def select(self): 
     self.selected = True 

    def unselect(self): 
     self.selected = False 

alors Python aurait soulevé un IndentationError:

% test.py 
    File "/home/unutbu/pybin/test.py", line 7 
    def select(self): 
        ^
IndentationError: unindent does not match any outer indentation level 
+0

Ceci est un bon conseil. En fait, c'est ce que je fais normalement dans d'autres langues. Je n'ai aucune idée pourquoi je ne l'ai pas fait dans ce cas. Mais ce que je veux savoir, ce sont des techniques qui seraient spécifiques à python. –

+0

@Neil: Malheureusement, je ne peux pas penser à des techniques spécifiques à Python qui pourraient être utiles ici, seulement des techniques générales. Les tests unitaires ont été mentionnés. J'utilise libéralement des instructions d'impression lors du débogage, et j'ai tendance à écrire du code en petits bits avec des tests (unitaires) entre les deux. Maintenant que vous avez été mordu par cela, je soupçonne que votre conscience de ce problème potentiel sera grandement accrue, et peut-être que cela en soi permettra d'éviter de futures erreurs. – unutbu

1

En général: beaucoup de tests unitaires. Les critiques de code aident aussi beaucoup. Cette erreur spécifique semble facile à identifier puisque si value était censé être dépassé alors qu'il aurait été une variable de classe, un test d'unité approprié aurait détecté qu'il ne l'est pas dans ce cas.

Des outils tels que PyDev réussissent bien à trouver d'autres erreurs courantes, donc vous pourriez envisager de les prendre en compte.

1

Je n'ai pas ces problèmes;) Au moins, je les avoir moins souvent qu'une orthèse superflue, manquante ou égarée ou le classique:

if (foo) 
    bar(); 
    baz(); 

dans un langage qui utilise des accolades. Cela étant dit, certains styles de codage aident. Par exemple, je listerai toujours les variables de classe en haut du corps de la classe, donc si j'ai accidentellement l'indentation, j'obtiendrai une IndentationError au lieu de créer une variable locale inutilisée. Au fait, je l'ai toujours vu comme ça. L'indentation cohérente (je suis avec PEP 8 et utilise 4 espaces) aide également, certaines personnes utilisent seulement un espace pour certains blocs - c'est vraiment facile à négliger.

L'analyse de code statique (comme PyLint) peut pointer de telles erreurs, mais je n'ai pas beaucoup d'expérience avec ceux-ci. Comme je l'ai écrit, ça marche juste la plupart du temps.

+1

Tout à fait d'accord que l'espace significatif de python empêche plus de problèmes que cela provoque, ainsi que la promotion de bonnes pratiques de méta-programmation comme la cohérence stylistique entre les codeurs. –

Questions connexes