2016-02-10 2 views
0

Je souhaite créer une classe qui nécessite une méthode spécifique, avec des arguments spécifiques et des valeurs de retour. Je peux hériter d'une classe abstraite qui nécessite la méthode à implémenter - mais je n'ai pas la capacité de forcer des arguments spécifiques et de renvoyer des valeurs dans un langage statique comme Java (je pourrais lancer une erreur si je le voulais) . Quelle est la meilleure façon d'aborder cela avec Python? J'ai regardé dans type allusion un peu mais je ne pense pas que cela résout ce problème.Comment appliquer une interface de méthode avec Python?

+1

Si vous en avez vraiment besoin, vous pouvez consulter MyPy: http://mypy-lang.org/ mais je ne pense pas que cette fonctionnalité existe dans CPython. Type hinting est la chose la plus proche. –

+0

ouais je n'étais pas sûr si c'était possible. Je pensais que MyPy est ce type d'indication dans Python 3 basé? Ou peut-être qu'ils ont seulement porté une partie de celui-ci – Andrew

+2

Vous avez raison, PEP-484 est basé sur MyPy. Je crains que vous utilisiez la mauvaise langue si vous voulez que le paramétrage soit appliqué au moment de l'exécution. Python ne le fait pas, à moins d'ajouter des contrôles explicites 'isinstance' à la méthode. – chepner

Répondre

1

Cela semble fondamentalement non-pythonique. Il n'y a pas de typage des paramètres de la fonction dans python, donc il n'y a aucun moyen de restreindre les types d'arguments à une fonction.

La recherche de type est utile pour la documentation ou les linters de code, mais python n'utilise pas cette information pour appliquer quoi que ce soit à l'exécution.

Si vous voulez vraiment assurer la validité d'une interface (même au-delà des seuls types d'argument), la façon de le faire serait avec des tests unitaires fonctionnels.

Le testage et le développement piloté par les tests sont si répandus dans la communauté python que la recherche de type n'ajoute pas grand-chose quand il s'agit de tester et de trouver des bogues. Et bien que ce soit un point discutable, il y en a beaucoup qui croient que tout avantage de l'indication de type est immédiatement détruit en rendant le code python plus difficile à lire. Il y a des possibilités prometteuses avec l'indication de type de pouvoir compiler Python vers C ou Java, mais elles n'existent pas encore.

+0

L'utilitaire mypy ne compile-t-il pas et vérifie-t-il les problèmes avant l'exécution? Ou est-ce que je le comprends mal – Andrew

+1

mypy peut tester un système fermé. Il peut vérifier que, en interne, dans votre code, vous n'appelez pas une fonction avec des types de données incorrects. Si vous écrivez un paquet python que d'autres vont utiliser, il ne peut évidemment pas le tester, donc il n'applique toujours aucun type. Si vous définissez des indicateurs de type dans votre code, cela signifie que d'autres utilisateurs de votre bibliothèque peuvent exécuter mypy sur leur propre code et obtenir des avertissements de type. –

+0

Je ne pense pas que le PO demande à faire quoi que ce soit en cours d'exécution; il dit: «Je peux lancer la course si je le veux», mais il semble dans le sens que c'est facile. Il semble vouloir * statique * vérifier le temps. Et PEP 484/mypy fournit exactement cela: si vous définissez une classe pour avoir des méthodes abstraites typées, les sous-classes ne passeraient pas le contrôle de type si elles ont les mauvais arguments. – max