我一直在研究用于自动构建的基本测试框架。下面的代码代表使用不同程序对两台机器之间的通信进行的简单测试。在实际执行任何测试之前,我想完全定义它们- 因此,下面的此测试直到声明所有测试后才真正运行。这段代码只是测试的声明。
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外部使用变量是不合法的,那么解释器将不知道我在说什么。相反,它无声地绑定到最后一个“客户端”的实例。
另外,有没有办法按照我的意愿强制执行分辨率?
该client变量是在外部范围中定义的,因此,在lambda运行该变量时,它将始终设置为列表中的最后一个客户端。
client
lambda
为了获得预期的结果,可以给lambda一个带有默认值的参数:
passIf = lambda client=client: client.returncode(CMD2) == 0
由于默认值是在定义lambda时评估的,因此其值将保持正确。
另一种方法是在函数内部创建lambda:
def createLambda(client): return lambda: client.returncode(CMD2) == 0 #... passIf = createLambda(client)
这里拉姆达指client在可变createLambda的功能,其具有正确的值。
createLambda