@@ pyqtSlot()与另一个装饰器一起使用时,会导致调用了错误的处理程序方法

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

我的问题与本主题的上一个问题有关:Decorator adds an unexpected argument

问题是,如果我使用同一组装饰器创建更多方法,则每个信号都调用相同的装饰器,这是多么奇怪。下面的示例:

signal_1.connect(fun_1)
signal_2.connect(fun_2)

@pyqtSlot()
@handle_exceptions
def fun_1():
    print('aaaaa')

@pyqtSlot()
@handle_exceptions
def fun_2():
    print('bbbbb')

signal_1.emit()
signal_2.emit()

输出:

aaaaa
aaaaa
python pyqt decorator
2个回答
3
投票

您必须使用@functools.wraps(有关需要的更多信息,请阅读@functools.wraps的答案)

What does functools.wraps do?

1
投票

创建装饰器后,它将接收该函数作为参数,并且PyQt将该函数的名称用作指向将用于该插槽的实际函数的“指针”,除非指定了特定名称,否则它实际上返回该函数的“包装器”。

由于您是针对同一包装器(import functools def handle_exceptions(func): @functools.wraps(func) def func_wrapper(*args, **kwargs): try: print(args) return func(*args, **kwargs) except Exception as e: print(e) return None return func_wrapper)使用插槽装饰器,因此PyQt会认为它们具有相同的功能,并且会覆盖前一个(或忽略下一个,我不确定:我已经得到不同的结果,有时调用第一个函数,其他调用第二个)。

这与eyllanesc在func_wrapper中的解释有关,我认为这是更正确的方法。

尽管如此,另一种解决方案可能是将唯一名称设置为广告位的参数:

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