调用函数然后反转相同函数的参数并再次调用

时间:2013-12-10 16:37:16

标签: python python-3.x pyqt pyqt4

我想知道这是否可以在一个功能中使用:

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)

3 个答案:

答案 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来验证方法的相对速度。