remoteTests = []for clIEnt in clIEnts: t = Test( name = 'Test ' + str(host) + ' => ' + str(clIEnt),cmds = [ host.start(CMD1),clIEnt.start(CMD2),host.wait(5),host.stop(CMD1),clIEnt.stop(CMD2),],passIf = lambda : clIEnt.returncode(CMD2) == 0 )remoteTests.append(t)
无论如何,在运行测试之后,它运行’passIf’定义的函数.由于我想为多个客户端运行此测试,我正在迭代它们并为每个客户端定义测试 – 没什么大不了的.但是,在第一个客户端上运行测试之后,’passIf’会对客户列表中的最后一个进行评估,而不是lambda声明时的’clIEnt’.
我的问题是:python何时绑定lambdas中的变量引用?我想如果使用lambda外部的变量是不合法的,解释器就不知道我在说什么.相反,它默默地绑定到最后一个“客户端”的实例.
另外,有没有办法像我预期的那样强制解决问题?
解决方法 客户端变量在外部作用域中定义,因此在运行lambda时,它将始终设置为列表中的最后一个客户端.要获得预期结果,可以为lambda提供一个具有默认值的参数:
passIf = lambda clIEnt=clIEnt: clIEnt.returncode(CMD2) == 0
由于在定义lambda时评估默认值,因此其值将保持正确.
另一种方法是在函数内创建lambda:
def createLambda(clIEnt): return lambda: clIEnt.returncode(CMD2) == 0#...passIf = createLambda(clIEnt)
这里lambda引用createLambda函数中的客户端变量,该变量具有正确的值.
总结以上是内存溢出为你收集整理的Python Lambdas和变量绑定全部内容,希望文章能够帮你解决Python Lambdas和变量绑定所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)