在一个循环中使用python中的curry函数

2024-10-08 23:19:19 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是一些简化我所做工作的代码:

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()

这是它的输出:

^{pr2}$

我想让查理,然后辛迪,为什么辛迪要被展示两次?在


Tags: 代码innoneforfunctionvarsdictcommands
2条回答

您遇到了一个经典的绑定时间问题,@Mike的解决方案是典型的。一个好的选择是编写一个高阶函数:

def makecall(kwargs):
  def callit():
    return a_function(**kwargs)
  return callit

并在循环中使用commands.append(makecall(kwargs))。这两种解决方案的工作原理是相同的(在我的例子中,通过传递一个普通的参数,在@Mike's中是一个命名参数的默认值)来强制早期绑定;选择只是一个风格或优雅的问题(我,而我在超简单的情况下容忍lambda,只要有最细微的并发症介入,我非常喜欢好的旧的def;-)。在

在调用函数之前,函数体不会运行。当您执行lambda: a_function(**kwargs)操作时,kwargs直到您真正调用函数时才会被查找。在这一点上,它被分配到循环中最后一个。在

获得您想要的结果的一个解决方案是执行commands.append(lambda kwargs=kwargs: a_function(**kwargs))

相关问题 更多 >

    热门问题