Est-il possible qu'une fonction lambda ait un nombre variable d'arguments? Par exemple, je veux écrire une métaclasse, qui crée une méthode pour chaque méthode d'une autre classe et cette méthode nouvellement créée renvoie la valeur opposée de la méthode d'origine et a le même nombre d'arguments. Et je veux le faire avec la fonction lambda. Comment passer les arguments? C'est possible?varargs dans les fonctions lambda en Python
class Negate(type):
def __new__(mcs, name, bases, _dict):
extended_dict = _dict.copy()
for (k, v) in _dict.items():
if hasattr(v, '__call__'):
extended_dict["not_" + k] = lambda s, *args, **kw: not v(s, *args, **kw)
return type.__new__(mcs, name, bases, extended_dict)
class P(metaclass=Negate):
def __init__(self, a):
self.a = a
def yes(self):
return True
def maybe(self, you_can_chose):
return you_can_chose
Mais le résultat est tout à fait tort:
>>>p = P(0)
>>>p.yes()
True
>>>p.not_yes() # should be False
Traceback (most recent call last):
File "<pyshell#150>", line 1, in <module>
p.not_yes()
File "C:\Users\Desktop\p.py", line 51, in <lambda>
extended_dict["not_" + k] = lambda s, *args, **kw: not v(s, *args, **kw)
TypeError: __init__() takes exactly 2 positional arguments (1 given)
>>>p.maybe(True)
True
>>>p.not_maybe(True) #should be False
True
Lien pertinent: http://code.activestate.com/recipes/502271/ –