bra*_*age 23 python lambda variadic-functions
lambda函数是否有可能具有可变数量的参数?例如,我想编写一个元类,它为其他类的每个方法创建一个方法,这个新创建的方法返回原始方法的相反值,并且具有相同数量的参数.我想用lambda函数做到这一点.如何传递参数?可能吗?
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
Run Code Online (Sandbox Code Playgroud)
但结果完全错了:
>>>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
Run Code Online (Sandbox Code Playgroud)
int*_*jay 32
在lambda函数中使用varargs没有问题.这里的问题是不同的:
问题是lambda引用了循环变量v.但是当调用lambda时,值v已经改变,lambda调用了错误的函数.在循环中定义lambda时,始终需要注意这一点.
你可以通过创建一个附加函数来解决这个问题,该函数将保存v闭包中的值:
def create_not_function(v):
return lambda s, *args, **kw: not v(s, *args, **kw)
for (k, v) in _dict.items():
if hasattr(v, '__call__'):
extended_dict["not_" + k] = create_not_function(v)
Run Code Online (Sandbox Code Playgroud)
Joe*_*erg 19
是.
>>> l = lambda *x: print(x)
>>> l(1,2,3)
(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22467 次 |
| 最近记录: |