【发布时间】:2022-01-13 17:45:17
【问题描述】:
我定义了以下类:
class BackgroundThread(threading.Thread):
def __init__(self, *args: typing.Any, **kwargs: typing.Any) -> None:
super().__init__(*args, **kwargs)
self._quit = threading.Event()
def run(self) -> None:
while not self._quit.wait(timeout=0.0):
self._target(*self._args, **self._kwargs)
def __enter__(self) -> None:
self.start()
return None
def __exit__(self, *args: typing.Any) -> None:
self._quit.set()
self.join()
代码完全按预期工作。然而,mypy 抱怨说
“BackgroundThread”没有属性“_target”
“BackgroundThread”没有属性“_args”
“BackgroundThread”没有属性“_kwargs”
我可以通过插入来解决这个问题
class BackgroundThread(threading.Thread):
_target: typing.Callable
_args: typing.Tuple
_kwargs: typing.Dict[str, typing.Any]
但是,这似乎很老套。为什么 mypy 不能识别这些来自父类的变量?是因为下划线开头吗?
【问题讨论】:
-
访问这些变量本身有点麻烦。我不会使用要重复的函数作为目标,而是定义一个接受函数、事件和附加参数的函数并运行循环。然后使用那个循环函数作为真正的目标。
标签: python type-hinting mypy