Nor*_*sUp 3 python lambda currying
所以这里有一些代码简化了我一直在做的工作:
vars = {
'a':'alice',
'b':'bob',
}
cnames = ['charlie', 'cindy']
commands = []
for c in cnames:
kwargs = dict(vars)
kwargs['c'] = c
print kwargs
commands.append(lambda:a_function(**kwargs))
print commands
def a_function(a=None, b=None, c=None):
print a
print b
print c
for c in commands:
print "run for "+ repr(c)
c()
Run Code Online (Sandbox Code Playgroud)
这是它的输出:
{'a': 'alice', 'c': 'charlie', 'b': 'bob'}
{'a': 'alice', 'c': 'cindy', 'b': 'bob'}
[<function <lambda> at 0x1001e9a28>, <function <lambda> at 0x1001e9e60>]
run for <function <lambda> at 0x1001e9a28>
alice
bob
cindy
run for <function <lambda> at 0x1001e9e60>
alice
bob
cindy
Run Code Online (Sandbox Code Playgroud)
我希望得到查理,然后cindy,为什么cindy被展示两次?
您遇到了经典的绑定时间问题,@ Mike的解决方案是经典的解决方案.一个很好的选择是编写一个更高阶的函数:
def makecall(kwargs):
def callit():
return a_function(**kwargs)
return callit
Run Code Online (Sandbox Code Playgroud)
并commands.append(makecall(kwargs))在你的循环中使用.两个解决方案都遵循相同的原则(通过参数的通过强制早期绑定 - 在我的情况下是一个普通的参数,@ Mike的命名参数的默认值); 选择只是风格或优雅的问题(我,虽然我容忍lambda超级简单的情况,只要最微妙的复杂介入,我非常喜欢好老def;-).
| 归档时间: |
|
| 查看次数: |
2491 次 |
| 最近记录: |