python - 尽管 mypy 很高兴,但通用超类“未定义”
问题描述
我一直在与 mypy 很高兴的奇怪情况作斗争,但是当我运行代码时 python 崩溃了。这是我在使用泛型时遇到的一个问题。我在同一个目录中有两个文件。当我在 中运行 python3 时sample_parser.py
,出现以下错误:
Traceback (most recent call last):
File "/Users/joe/repos/ut-norm-james/so_generics/sample_parser.py", line 8, in <module>
class SampleParser(LookaheadParser[str]):
NameError: name 'LookaheadParser' is not defined
这是lookahead_parser.py
:
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from typing import TypeVar, Generic, Optional, Callable
_T = TypeVar("_T")
StateFunc = Callable[[_T], Callable]
class LookaheadParser(Generic[_T]):
def __init__(self):
self._token_index: int = 0
self._tokens: list[_T] = []
self._state: StateFunc
def _parse(self) -> None:
while self._token_index < len(self._tokens):
self._state = self._state(self._tokens[self._token_index])
self._token_index += 1
def _lookahead(self, offset: int) -> Optional[_T]:
prospective_index = self._token_index + offset
if prospective_index < len(self._tokens):
return self._tokens[prospective_index]
return None
def _advance(self, offset: int) -> None:
self._token_index += offset
这是sample_parser.py
:
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from .lookahead_parser import LookaheadParser, StateFunc
class SampleParser(LookaheadParser[str]):
def __init__(self, raw_text: str):
self._raw_text = raw_text
self._state = self._state_first
def parse(self) -> None:
self._parse()
def _state_first(self, token: str) -> StateFunc:
pass # stub
if __name__ == "__main__":
pass # stub
我正在运行 Python 3.9.6,但它也在 3.9.5 中发生。无论我使用_T
还是都会出现问题T
,以防您对此有所怀疑。mypy 本身没有报告任何问题。
解决方案
lookahead_parser
仅当TYPE_CHECKING
为真时才导入。该变量在运行时为假,因此模块永远不会被加载。只需删除if TYPE_CHECKING:
零件并无条件导入即可。
from .lookahead_parser import LookaheadParser, StateFunc
推荐阅读
- excel - 返回表列中的最后一个值
- ansible - 如何绕过失败的ansible任务,但仍将它们报告为失败?
- c# - 在 UWP 应用中使用 Flyout 时更改覆盖区域的颜色
- javascript - 价格比较器的跟踪代码管理器销售跟踪
- gruntjs - 为不可多任务的 grunt 插件创建两个配置
- html - 如何将主图像下方的图像和文本部分移动为重叠?
- android - 如何为回收站视图 onclick 功能添加动画?
- java - Google LoadingCache 无法存储加载的对象
- php - 与类新的 DateTime PHP 不一致
- c++ - 我的程序在调用 'parsePacket()' 后是继续执行还是等到它收到数据?