Python dynamique des noms de fonction
Je suis à la recherche d'une meilleure façon de fonctions d'appel basé sur une variable en Python vs l'aide de if/else, comme ci-dessous. Chaque code d'état, a une fonction correspondante
if status == 'CONNECT':
return connect(*args, **kwargs)
elif status == 'RAWFEED':
return rawfeed(*args, **kwargs)
elif status == 'RAWCONFIG':
return rawconfig(*args, **kwargs)
elif status == 'TESTFEED':
return testfeed(*args, **kwargs)
...
Je suppose que cela va nécessiter une certaine forme de la fonction de fabrication, mais pas sûr de la syntaxe
OriginalL'auteur drjeep | 2009-03-25
Vous devez vous connecter pour publier un commentaire.
La manière canonique pour ce faire est d'utiliser un dictionnaire pour émuler
switch
ouif/elif
. Vous trouverez plusieurs questions à des problèmes similaires ici.Mettre vos fonctions dans un dictionnaire avec vos codes d'état en tant que clés:
Droit, merci de le signaler.
ce n'est pas sec quand même
Je pense que c'est un moyen sûr, il soulève une exception lorsque
status
inattendu nom de la méthode.Ce n'est pas le canoniques pythonic moyen de la fonction de distribution. getattr est la forme canonique de la méthode dans ce cas
OriginalL'auteur
vous pourriez trouver
getattr
utile, je suppose queil serait de travailler sur n'importe quel objet. les modules sont des objets trop.
OriginalL'auteur SilentGhost
en supposant que ces fonctions appartiennent à un module:
OriginalL'auteur vartec
il semble que vous pouvez utiliser getattr un peu différente (à mon avis de façon plus élégante)
ou si la fonction est importé comme ci-dessous
péché est maintenant dans l'espace de noms, de sorte que vous pouvez l'appeler par
OriginalL'auteur to-chomik
Certaines améliorations pour SilentGhost réponse:
si vous voulez appeler la fonction définie dans le module en cours.
Bien qu'il semble laid. J'aimerais utiliser la solution avec dictionnaire.
OriginalL'auteur Eugene Morozov
Regardez ceci: getattra en fonction de répartiteur
lien fixe
OriginalL'auteur hasen
J'ai rencontré le même problème que précédemment. Jetez un oeil à cette question, je pense que c'est ce que vous cherchez.
Dictionnaire ou Si les Déclarations
Espère que cela est utile
Eef
OriginalL'auteur RailsSon
quelques changement par rapport à la une:
Semble comme il devrait fonctionner pour moi...
Cela fonctionne en effet
non, il n'est pas. c'est la même erreur que heikogerlach avait au début.
J'ai remplacé "statut" avec la variable, donc je suppose que techniquement il n'a pas. Je suis plus intéressé par la méthode que de la sémantique
OriginalL'auteur linjunhalida