2010-11-18 6 views
2

Je connais the problem et comment y remédier. Je voudrais demander de l'aide pour trouver ce problème dans le code existant. En d'autres termes, j'essaie de trouver tous les endroits où ce piège est enterré, donc je peux le réparer.Python: attraper des arguments par défaut mutables

Y at-il un outil qui peut m'aider?

+3

Personne n'ayant d'expérience n'utiliserait jamais une liste ou un dictionnaire comme argument par défaut. Tu le fais une fois. Huit heures et beaucoup de larmes plus tard, vous comprendre et ne jamais le faire à nouveau;) –

+0

"J'essaie de trouver tous les endroits où ce piège est enterré"? Qui l'a enterré? Trouvez les programmeurs qui ont fait cette erreur et expliquez-leur le problème. Pourquoi ne peuvent-ils pas apprendre et corriger leur code? –

+0

@ S.Lott: titre convenu et édité. Et c'est mon propre code avant que j'apprenne ce problème. – max

Répondre

3

Qu'est-ce qui ne va pas avec grep?

grep "^\s*def.*=(\[\]|\{\}|set\(\))" 

Ceci trouvera à peu près tous les coupables habituels.

Si vous utilisez une instance d'une de vos propres classes mutables comme valeur par défaut, vous devrez vérifier cela séparément.

+0

Que faire si la définition de la fonction est divisée sur plusieurs lignes? Dans mon expérience limitée, je n'ai jamais une expression regex pour rechercher correctement dans le code. – max

+0

@max: Combien de définitions de fonctions couvrent plusieurs lignes? Quelle est la taille de votre base de code? Ceci est un exercice unique. Si cela nécessite d'utiliser grep pour trouver des définitions de fonctions qui ne sont pas complètes sur une ligne, c'est bon. Vous ne ferez plus jamais ce travail. –

+1

@max Je sais que c'est vieux, mais pour trouver les variantes (rares) multi-lignes, cela devrait fonctionner .. pcregrep devrait être livré avec la plupart des versions de Linux, mais pas sur OSX et je ne sais pas sur la disponibilité pour Windows: 'trouver. -name "* py" | xargs pcregrep -M 'def. +? \ ([^)] + [\ [{[] '' – slinkp

10

Pylint a un avertissement pour les valeurs d'argument par défaut des types mutables. C'est personnalisable, donc vous pouvez l'obtenir juste si vous le souhaitez.

+0

Malheureusement, je n'arrive pas à trouver Pylint pour fonctionner avec ActiveState Python 3.1 sous Windows. Quelqu'un sait si c'est disponible? – max

Questions connexes