Question

Mes antécédents sont C et C ++. J'aime beaucoup Python, mais il y a un aspect de celui-ci (et d'autres langages interprétés, je suppose) avec lequel il est très difficile de travailler lorsque vous êtes habitué aux langages compilés.

Lorsque j'ai écrit quelque chose en Python et que je suis capable de l'exécuter, rien ne garantit qu'il ne reste aucune erreur spécifique à la langue. Pour moi, cela signifie que je ne peux pas compter uniquement sur ma défense d'exécution (tests rigoureux des entrées, des affirmations, etc.) pour éviter les plantages, car dans 6 mois, quand du code autrement agréable serait finalement exécuté, il risquerait de craquer à cause d'une typo stupide .

Il est clair qu'un système doit être suffisamment testé pour s'assurer que tout le code a été exécuté, mais la plupart du temps j'utilise Python pour des scripts internes et de petits outils, qui ne reçoivent bien sûr jamais l'attention requise. En outre, certains codes sont si simples que (si votre arrière-plan est en C / C ++), vous savez qu’ils fonctionneront correctement tant qu’ils seront compilés (par exemple, les méthodes getter à l’intérieur des classes, généralement le retour d’une variable membre).

Donc, ma question est évidente: y a-t-il un moyen (avec un outil spécial ou autre) de garantir que tout le code de mon script Python sera "compilé"? et courir?

Était-ce utile?

La solution

Consultez PyChecker et PyLint .

Voici un exemple de sortie de pylint, résultant du programme trivial:

print a

Comme vous pouvez le constater, il détecte la variable non définie, ce que py_compile ne fera pas (délibérément).

in foo.py:

************* Module foo
C:  1: Black listed name "foo"
C:  1: Missing docstring
E:  1: Undefined variable 'a'


...

|error      |1      |1        |=          |

Exemple trivial de la raison pour laquelle les tests ne sont pas assez bons, même s'ils couvrent "chaque ligne":

bar = "Foo"
foo = "Bar"
def baz(X):
    return bar if X else fo0

print baz(input("True or False: "))

EDIT: PyChecker gère le ternaire pour moi:

Processing ternary...
True or False: True
Foo

Warnings...

ternary.py:6: No global (fo0) found
ternary.py:8: Using input() is a security problem, consider using raw_input()

Autres conseils

D'autres ont mentionné des outils tels que PyLint, qui sont plutôt bons, mais il est tout simplement impossible de le faire à 100%. En fait, vous pourriez même ne pas vouloir le faire. L’un des avantages de la dynamicité de Python réside dans le fait que vous pouvez faire des choses folles, comme insérer des noms dans la portée locale via un accès par dictionnaire.

En résumé, si vous voulez un moyen d’attraper les erreurs de type lors de la compilation, vous ne devez pas utiliser Python. Un choix de langue implique toujours un ensemble de compromis. Si vous choisissez Python plutôt que C, sachez que vous utilisez un système de type fort pour un développement plus rapide, une meilleure manipulation des chaînes, etc.

Je pense que vous recherchez une couverture de ligne de test de code. Vous souhaitez ajouter des tests à votre script pour vous assurer que toutes vos lignes de code, ou autant que vous en avez le temps, subissent des tests. Les tests représentent beaucoup de travail, mais si vous voulez le type d'assurance que vous demandez, il n'y a pas de repas gratuit, désolé :(..

Si vous utilisez Eclipse avec Pydev en tant qu'EDI, il peut marquer de nombreuses fautes de frappe pour vous en rouge gribouillis immédiatement, et a l'intégration de Pylint aussi. Par exemple:

foo = 5
print food

sera marqué comme "Variable non définie: aliment". Bien sûr, cela n’est pas toujours précis (la nourriture a peut-être été définie auparavant à l’aide de setattr ou d’autres techniques exotiques), mais cela fonctionne bien la plupart du temps.

En général, vous ne pouvez analyser votre code de manière statique que dans la mesure où votre code est réellement statique; plus votre code est dynamique, plus vous avez réellement besoin de tests automatisés.

Votre code est en fait compilé lorsque vous l'exécutez. Le moteur d'exécution Python se plaindra s'il y a une erreur de syntaxe dans le code. Comparé aux langages compilés statiquement, comme C / C ++ ou Java, il ne vérifie pas si les noms et types de variables sont corrects # # 8211; pour cela, vous devez exécuter le code (par exemple, avec des tests automatisés).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top