12
votes

Équivalent de rubis obj.send en python

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)

Y a-t-il quelque chose de similaire dans Python.

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.


4 commentaires

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) plus tard sur. La reliure de la méthode de Python est bonne pour cela, en cas de besoin.


4 Réponses :


23
votes
getattr(obj, "name")(args)
​​​​

0 commentaires

9
votes

hmmm ... getattr (obj, funcname) (* args, ** kwargs)? XXX


0 commentaires

1
votes

En dehors du getattr () déjà mentionné () code> intégré:

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>

# 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
  • Vous pouvez simplement tourner l'exemple ci-dessus en 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>
  • Vous pouvez utiliser 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>
  • opérateur.methodcaller () de la STDLIB est un joli raccourci Dans certains cas: sur la base d'un nom de méthode, et éventuellement quelques arguments, il crée une fonction qui appelle la méthode avec ce nom sur un autre objet (et si vous avez fourni des arguments supplémentaires lors de la création de la méthodeCaller, il appellera la méthode avec ces arguments. ) li> ul> p>


0 commentaires

1
votes

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()


0 commentaires