加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python Lambdas和变量绑定

发布时间:2020-12-16 23:16:34 所属栏目:Python 来源:网络整理
导读:我一直致力于自动构建的基本测试框架.下面的代码段代表了使用不同程序的两台机器之间通信的简单测试.在我实际进行任何测试之前,我想完全定义它们 – 所以下面的测试实际上并没有在声明所有测试之后运行.这段代码只是一个测试声明. remoteTests = []for clien
我一直致力于自动构建的基本测试框架.下面的代码段代表了使用不同程序的两台机器之间通信的简单测试.在我实际进行任何测试之前,我想完全定义它们 – 所以下面的测试实际上并没有在声明所有测试之后运行.这段代码只是一个测试声明.
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函数中的客户端变量,该变量具有正确的值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读