今天在使用python的装饰器的时候,出现了一些小问题。

下面是装饰器的代码。

def try_except_decorator(func):
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as e:
            print(f'发生错误,错误在于:{e}')
  return wrapper

装饰器的代码非常的平常,就是一个try-except的功能。

然后是调用装饰器的代码部分:

    @try_except_decorator
    def show_next_word(self):
        self.current_word_index = (self.current_word_index + 1) % len(self.word_list)
        print('当前单词序列:' + str(self.current_word_index))
        self.word_label.setText(self.word_list[self.current_word_index].english)
        self.chinese_label.setText(self.word_list[self.current_word_index].chinese)

这部分也很平常,就是当前单词序列索引的增加。

下面是方法连接的部分:

self.reme_button.clicked.connect(self.show_next_word)

但是出现了报错:

TypeError: argument 1 has unexpected type 'NoneType'

错误描述是在connec方法中我传入了Nonetype对象。

先说这个问题的解决办法:使用lambda来包装创建一个匿名函数。代码如下:

self.reme_button.clicked.connect(lambda: self.show_next_word())

这样就好了。

对于这个小问题我的理解是,在使用装饰器并返回func之后,返回的是func 的调用结果,而非是函数。装饰器如其名,经过装饰后的结果并不是跟原来一模一样的。而lambda作为一个小函数,接收调用结果也就是 self.show_next_word()作为参数,并对其进行包装,做成connect可以接收的方法。