Ist es möglich, dass eine Lambda-Funktion eine variable Anzahl von Argumenten hat? Ich möchte z.B. eine Metaklasse schreiben, die für jede Methode einer anderen Klasse eine Methode erstellt und diese neu erstellte Methode gibt den entgegengesetzten Wert der ursprünglichen Methode zurück und hat die gleiche Anzahl von Argumenten. Und ich möchte dies mit einer Lambda-Funktion tun. Wie kann ich die Argumente übergeben? Ist das möglich?
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
Aber das Ergebnis ist völlig falsch:
>>>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