Lambda 表达式像比较运算符一样计算参数

问题描述 投票:0回答:1

我有可以动态生成 PyQt5 应用程序设置页面的代码。我的问题是,当尝试连接到信号时,我需要使用 lambda 表达式,如本文的“循环问题”部分所述。但是,当我运行代码时,lambda 表达式中的第一个参数正在执行比较而不是赋值。下面是代码: for key, setting in self.settings.items(): display = QHBoxLayout() display.addWidget(QLabel(setting['label'])) constructor = globals()[setting['control']] control = constructor() control = set_widget_value(control, setting['value']) signal_name = get_widget_signal(control) if signal_name != None: signal = getattr(control, signal_name) slot = lambda control = control, key = key : self.update_settings(key, control) signal.connect(slot) display.addWidget(control) layout.addLayout(display)

我希望 lambda 表达式的计算结果为:

self.update_settings('string', QObject)

但它实际评估的是:

self.update_settings('string', True)

就好像将赋值运算符作为比较运算符来处理一样。

我尝试了不同的语法,但得到了相同的结果。如果我交换 lambda 表达式中的控制参数和键参数,相反的参数将被计算为 True,因此传递到 lambda 表达式的第一个参数始终像比较运算符一样被计算。为了进行测试,我还创建了一个 args 对象并将其传递到 lambda 表达式中,但在像比较一样对其进行评估时发生了同样的问题。

args = {key , control} slot = lambda args = args : self.update_settings(args) signal.connect(slot)

	
python python-3.x pyqt5
1个回答
0
投票
syntax

时,就会出现问题,通常在创建 lambda 时进行计算,并且由于默认值被解释为布尔值,因此 lambda 中的第一个参数被视为比较,即 True .

话虽如此,您所需要做的就是更改顺序,但我希望:

slot = lambda key=key, control=control: self.update_settings(key, control)

	
© www.soinside.com 2019 - 2024. All rights reserved.