Dans Ruby Si j'ai un objet Obj, avec une méthode appelée Funcname, je peux appeler la méthode à l'aide de la syntaxe suivante obj.send (funcname) p>
Y a-t-il quelque chose de similaire dans Python. P>
La raison pour laquelle je veux faire cela, que j'ai un relevé de commutation où je définit le funcname et que je souhaite l'appeler à la fin de la déclaration de commutation. p>
4 Réponses :
getattr(obj, "name")(args) ââââ
hmmm ... getattr (obj, funcname) (* args, ** kwargs)?
En dehors du Au fur et à mesure de la boucle IF-elif-elif-elif, vous pouvez utiliser un dictionnaire pour mapper vos "cas" sur les fonctions souhaitées / MÉTHODES: P> getattr () déjà mentionné () code> intégré:
# given func_a, func_b and func_default already defined
function_dict = {
'a': func_a,
'b': func_b
}
x = 'a'
function_dict(x)() # -> func_a()
function_dict.get('xyzzy', func_default)() # fallback to -> func_c
méthody_dict code> en utilisant par exemple
lambda obj: obj.method_a () code> au lieu de
Fonction_a code> etc., et ensuite faire
méthod_dict [cas] (obj) code> li>
getattr () code> au fur et à mesure que d'autres réponses ont déjà mentionnées, mais n'en avez besoin que si vous avez vraiment besoin d'obtenir la méthode de son nom. LI>
ou, si vous préférez, opérateur.Methodcaller ('foo') code> est une fonction qui appelle
foo code> sur tout ce que vous le transmettez. En d'autres termes,
bar.foo()
Python n'a pas de déclaration de commutation. De plus, la génération de noms de fonction à l'exécution est presque toujours une mauvaise idée.
@Rafe: Ce n'est pas couramment nécessaire, mais rien n'est intrinsèquement mal à ce sujet.
Oui, ça ne veut pas que je veux toujours le faire dans et si-elif-d'autre boucle. Je pense avoir ma réponse ci-dessous.
Vous pouvez toujours simplement affecter la fonction: "f = obj.funcunc" et appelez
f (args) code> plus tard sur. La reliure de la méthode de Python est bonne pour cela, en cas de besoin.