2013-12-10 63 views
1

我在想,如果这一个功能是可能的:调用那么功能反转功能相同的参数,并再次调用

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) 

回答

1

连接这样的信号时PyQt的一个常见的成语,是使用lambda默认参数:

self.button.clicked[()].connect(
     lambda x=1, y=2: (self.test(x, y), self.test(y, x))) 

有一对夫妇的事情,这里要注意。首先,[()]选择器是必要的,因为否则clicked将默认发送一个布尔参数,这会打破lambda的第一个参数。其次,函数调用必须进入一个元组(或等价物),因为lambda只能包含一个表达式(省略括号会给出错误)。

UPDATE

一些信号有几个重载发送不同的值。

例如,QButtonGroup.buttonClicked信号可以发送一个int或按钮。要选择特定的过载,你会做两种:

buttongroup.buttonClicked[int].connect(handler) 

或:

buttongroup.buttonClicked[QAbstractButton].connect(handler) 

在PyQt的,你也可以省略选择,在这种情况下,默认超载将被使用(这恰好成为上例中的第二个)。

但是,有一些信号(如QPushButton.clicked和QAction.triggered),它们的默认参数为,值为。也就是说,C++的签名如下所示:

void clicked (bool = 0) 

在PyQt的,这实际上意味着有重载:一个总是把一个布尔值,其中一个没有。默认超载是确实。因此,为了明确地选择一个,你有一个空的元组通过,即:

button.clicked[()].connect(handler) 
+0

这正是我正在寻找的。你可以解释[()]还是给我一些东西来寻找这个实际上做了什么? – Faller

+0

@Faller。我已经用解释更新了我的答案。 – ekhumoro

0

的一般做法是:

[yourMethod(*arg) for arg in itertools.permutations(args)] 

在这情况下,args代表(1,2)。当然,如果你不需要这些是一个列表,简单地用同样的方式,而不列表理解...

0

你可能想使用* ARGS与itertools一起:BTW

from itertools import permutations 

def press_test(*args): 
    all_args = permutations(args) 
    for arglist in all_args: 
     test(*arglist) 

,你真的不想在这里使用列表理解......列表理解像

只有在f(x)返回值时才有用。如果f(x)正要做某事,for循环(通常)会更快。由于f(x)只有'做了某些事情'并且没有返回值,所以你会注意到一个完整列表None,你只是想扔掉。您可以使用timeit来验证方法的相对速度。

+0

我试图做到这一点,而无需一个“press_test”功能。 – Faller