如何为QRunnable类中带pyqtSlot()装饰器的函数正确添加类型提示
PyQt中pyqtSlot装饰器的类型提示问题
状态
- 正在学习PyQt库的并发/线程使用,以下是教程简化后的代码片段
- 希望代码具备严格类型提示,但当前代码在mypy检查中报错
问题
- 使用
pyqtSlot()装饰器时,如何为函数正确添加类型提示? - 报错信息中提到的返回
None的父类(Superclass)和返回str|None的子类(Subclass)分别指什么?
已尝试方案
- 尝试解决编辑器错误提示,但未找到有效资料
- 从QtCore.pyi存根文件中查到
pyqtSlot()的定义为:def pyqtSlot(*types, name: typing.Optional[str] = ..., result: typing.Optional[str] = ...) -> typing.Callable[..., typing.Optional[str]]: ...,但因缺乏装饰器使用经验无法解读 - 确认QtCore.pyi中QRunnable类的
run方法定义为:def run(self) -> None: ...
代码片段
from typing import Callable from PyQt5.QtCore import QObject, QRunnable, pyqtSignal, pyqtSlot import traceback import sys class WorkerSignal(QObject): finished = pyqtSignal() error = pyqtSignal(tuple) result = pyqtSignal(object) progress = pyqtSignal(int) class Worker(QRunnable): def __init__(self, fn: Callable[[], str]) -> None: super(Worker, self).__init__() self.fn:Callable[[], str] = fn self.signals: WorkerSignal = WorkerSignal() @pyqtSlot() def run(self) -> None: # <====================== 报错行 try: result: str = self.fn() except Exception: traceback.print_exc() exctype, value = sys.exc_info()[:2] self.signals.error.emit((exctype, value, traceback.format_exc())) else: self.signals.result.emit(result) finally: self.signals.finished.emit()
mypy错误信息
$ mypy /tmp/tmp.py /tmp/tmp.py:22: error: Signature of "run" incompatible with supertype "QRunnable" [override] /tmp/tmp.py:22: note: Superclass: /tmp/tmp.py:22: note: def run(self) -> None /tmp/tmp.py:22: note: Subclass: /tmp/tmp.py:22: note: str | None Found 1 error in 1 file (checked 1 source file)
补充猜测
- 以下猜测是否正确?
pyqtSlot()接收返回typing.Optional[str](即str|None)的函数,这是否是报错中提到的子类?- QRunnable的
run()方法仅返回None,这是否是报错中提到的父类? - 当前问题是否可以转化为:当装饰器返回值与函数本身返回值不同时,如何正确使用装饰器并通过类型检查?
内容的提问来源于stack exchange,提问作者Garid
相关产品推荐
相关产品推荐

