我想知道这是否可以在一个功能中使用:
def test(x, y):
print(x, "+", y)
当我打电话给测试时,我想调用测试(1,2),然后立即调试(2,1)。
这是在QPushButton.clicked.connect中,因此它需要是可调用的。 我尝试了列表理解
[x for x in [test(1, 2), test(2, 1)]]
我得到一个奇怪的输出,我无法解释。
1 + 2
2 + 1
[None, None]
我能做什么lambda还是unpythonic?
现在我刚刚做了一个辅助功能,但我认为这有点难看。
def press_test(x,y):
test(x,y)
test(y,x)
编辑我应该补充一点,我有多个测试(y,x)应该遵循的函数:
def test2(x, y):
print(x, y)
def press_test2(x, y):
test2(x,y)
test(y,x)
答案 0 :(得分:1)
连接这样的信号时PyQt中常见的习惯用法是使用带有默认参数的lambda
:
self.button.clicked[()].connect(
lambda x=1, y=2: (self.test(x, y), self.test(y, x)))
这里有几点需要注意。首先,[()]
选择器是必要的,因为否则clicked
将默认发送一个布尔参数,这将破坏lambda的第一个参数。其次,函数调用必须进入元组(或等价),因为lambda
只能包含一个表达式(省略括号会产生错误)。
<强>更新强>:
某些信号有多个发送不同值的重载。
例如,QButtonGroup.buttonClicked信号可以发送int或按钮。要选择特定的重载,您可以执行以下任一操作:
buttongroup.buttonClicked[int].connect(handler)
或:
buttongroup.buttonClicked[QAbstractButton].connect(handler)
在PyQt中,您也可以省略选择器,在这种情况下将使用默认重载(恰好是上例中的第二个)。
但是,有一些信号(如QPushButton.clicked和QAction.triggered)有一个默认参数 value 。也就是说,C ++签名如下所示:
void clicked (bool = 0)
在PyQt中,这实际上意味着有两个重载:一个总是发送一个布尔值,另一个不发送。默认重载是执行的重载。因此,为了明确选择不的那个,你必须传入一个空元组,即:
button.clicked[()].connect(handler)
答案 1 :(得分:0)
一般方法是:
[yourMethod(*arg) for arg in itertools.permutations(args)]
在这种情况下,args
代表(1,2)
。当然,如果你不需要这些是一个列表,只需使用相同的方法,而不需要列表理解......
答案 2 :(得分:0)
您可能希望将* args与itertools一起使用:
from itertools import permutations
def press_test(*args):
all_args = permutations(args)
for arglist in all_args:
test(*arglist)
顺便说一下,你真的不想在这里使用列表理解......像这样的列表理解
[f(x) for x in list]
仅在f(x)返回值时才有用。如果f(x)只是要做某事,那么for循环(通常)更快。由于f(x)只是“做某事”并且没有返回值,所以当你注意到时,你会得到一个充满None
的列表,你只是要扔掉。您可以使用timeit
来验证方法的相对速度。