Có thể hàm lambda có số lượng đối số biến không? Ví dụ, tôi muốn viết một metaclass, tạo ra một phương thức cho mọi phương thức của một số lớp khác và phương thức mới được tạo này trả về giá trị ngược của phương thức gốc và có cùng số đối số. Và tôi muốn làm điều này với hàm lambda. Làm thế nào để vượt qua các đối số? Có thể không?varargs trong hàm lambda trong 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
Nhưng kết quả là hoàn toàn sai:
>>>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
Liên quan có liên quan: http://code.activestate.com/recipes/502271/ –