J'utilise une API Python qui s'attend à ce que je lui transmette une fonction. Cependant, pour diverses raisons, je veux lui passer une méthode, car je veux que la fonction se comporte différemment selon l'instance à laquelle elle appartient. Si je lui passe une méthode, l'API ne l'appellera pas avec le bon argument 'self', donc je me demande comment transformer une méthode en une fonction qui sait à quoi elle appartient.Quelle est la manière la plus pythonique de faire agir une méthode liée comme une fonction?
Il y a plusieurs façons de faire cela, y compris l'utilisation d'un lambda et d'une fermeture. J'ai inclus quelques exemples ci-dessous, mais je me demande s'il existe un mécanisme standard pour obtenir le même effet.
class A(object):
def hello(self, salutation):
print('%s, my name is %s' % (salutation, str(self)))
def bind_hello1(self):
return lambda x: self.hello(x)
def bind_hello2(self):
def hello2(*args):
self.hello(*args)
return hello2
>>> a1, a2 = A(), A()
>>> a1.hello('Greetings'); a2.hello('Greetings')
Greetings, my name is <__main__.A object at 0x71570>
Greetings, my name is <__main__.A object at 0x71590>
>>> f1, f2 = a1.bind_hello1(), a2.bind_hello1()
>>> f1('Salutations'); f2('Salutations')
Salutations, my name is <__main__.A object at 0x71570>
Salutations, my name is <__main__.A object at 0x71590>
>>> f1, f2 = a1.bind_hello2(), a2.bind_hello2()
>>> f1('Aloha'); f2('Aloha')
Aloha, my name is <__main__.A object at 0x71570>
Aloha, my name is <__main__.A object at 0x71590>
Um ... Je suis un idiot. Ça marche. – Nick