Question

Je ne peux pas trouver la réponse sur le SO, mais il est très probable que l'argument a déjà été discuté.

Je suis en train d'écrire un programme de taille assez petite en utilisant le langage Python. C'est ma première expérience « réelle » avec un langage dynamique et je préfère tout faire de la bonne façon. L'une des pratiques que je voudrais essayer d'appliquer depuis le début est unité de test.

Comment puis-je tester rapidement que les paramètres d'une méthode sont de type droit? Dois-je le faire?

Avec le type droit, je veux dire, par exemple, de vérifier qu'une méthode qui fonctionne avec des nombres flottants ne sont pas appelés à une chaîne. Dans ce cas, envisager la possibilité que la méthode doit évidemment accepter les entiers pairs et non seulement flotter.

Était-ce utile?

La solution

Comment puis-je tester rapidement que les paramètres d'une méthode sont de type droit?

Le moyen le plus rapide est de ne rien faire.

Sérieusement. L'interpréteur de langage dynamique (Python dans ce cas) vérifiera beaucoup plus rapidement que tout code que vous pourriez jamais écrire. Il suffit de soulever une exception et c'est tout ce que vous devez faire. Rien.

Devrais-je le faire?

Ne jamais tester le bon type. Vous ne pouvez pas - en général -. Faire

Le mot Let vous avez une fonction qui nécessite un « nombre »

def some_func( x ):
    assert isinstance(x, int)

Politique Bad. Votre fonction peut travailler longtemps ou flotter tout aussi bien que int.

assert instance( x, (int, long, float) )

Politique Bad. Vous avez encore excluez complexe. En effet, vous avez également exclu decimal.Decimal et fractions.Rational qui sont également des numéros valides.

vous êtes par « vérification de type » va exclure des types valides. La seule chose que vous pouvez faire est de supposer les types sont propres et gérer l'exception gracieusement quand quelqu'un « mésusages » votre fonction ou classe et fournit mauvais types.

La façon la plus gracieuse à la poignée TypeError?

Ne rien faire. Le programme devrait tout à fait tomber en panne.

Autres conseils

Vous ne devriez pas tester pour les types de spécifiques. Selon le docs , vous devez simplement utiliser le passé en objet comme nécessaires et donner à l'utilisateur la possibilité de fournir une implémentation personnalisée.

En fonction de ce que votre fonction fait, il peut être approprié de convertir les arguments du type attendu:

def my_func(a):
    a = float(a)
    # ...do stuff...

Une autre excellente option consiste à utiliser hasattr() pour vérifier pour le membre désiré avant de l'utiliser. Cela vous permettra de jeter une exception utile, au lieu de AttributeError par défaut.

tests unitaires avec une couverture complète est vraiment la seule façon de gérer les travaux de développement qui repose sur les langages dynamiques. De toute évidence, il est très utile d'avoir des tests solides de couverture pour les langues statiquement typés, mais dans mon expérience, il est encore plus important lorsque vous avez le typage dynamique.

Si vous n'êtes pas couvrant tout le code qui peut exécuter dans vos tests, alors vraiment vous demandez des ennuis. Donc, vous voulez utiliser un outil d'analyse de couverture en tandem avec vos tests unitaires pour prouver que vous atteignez tous votre code.

Même que ne se prémunir contre tous les pièges -. Vos tests ont vraiment besoin d'exercer toutes les erreurs de données d'entrée éventuellement erronées votre programme peut recevoir

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