mypy class 类型别名中的前向引用在其他模块中时出错
mypy class forward references in type alias gives error when in other module
我想将我的类型别名保留在一个模块中,比如 my_types
,以便能够
在我的应用程序中的任何地方使用它们(类似于标准 typing
模块)。
但是 mypy 抱怨未定义对 class X
的前向引用。
如果我稍后在同一个模块中定义 class X
没关系,但是如果它定义了
在另一个中,mypy 变得不高兴。
所以我的问题是,如何将所有类型别名保存在一个模块中
没有 mypy 产生关于未定义的前向引用的错误
同一个模块?或者这是一种错误的方法?
这是我的示例代码:
from my_types import SomeXs
class X:
pass
类型别名定义如下:
# my_types.py
from typing import List
SomeXs = List['X']
当我 运行 mypy 时,我得到一个错误 X
未定义:
$ mypy module.py
my_types.py:4: error: Name 'X' is not defined
Found 1 error in 1 file (checked 1 source file)
Mypy 需要在范围内有引用类型:
$ cat my_types.py
from typing import List
from main import X
SomeXs = List[X]
并且包含 X
的代码未引用 SomeXs
,因此不应将其导入那里:
$ cat main.py
class X:
pass
结果:
$ mypy .
Success: no issues found in 2 source files
我将在这里分享我在 mypy 文档 common issues section 中找到的解决方案:mypy 必须能够访问 X
的定义。为了避免导入循环,mypy
文档推荐了一个技巧——只导入定义
类型检查时会创建循环导入。它是这样的:
from typing import List, TYPE_CHECKING
if TYPE_CHECKING:
from main import X
SomeXs = List['X']
这使得 Python 解释器在执行时忽略导入
这段代码,但 mypy 仍然使用 main
.
中 X
的定义
瞧瞧:
$ mypy *.py
Success: no issues found in 2 source files
我想将我的类型别名保留在一个模块中,比如 my_types
,以便能够
在我的应用程序中的任何地方使用它们(类似于标准 typing
模块)。
但是 mypy 抱怨未定义对 class X
的前向引用。
如果我稍后在同一个模块中定义 class X
没关系,但是如果它定义了
在另一个中,mypy 变得不高兴。
所以我的问题是,如何将所有类型别名保存在一个模块中 没有 mypy 产生关于未定义的前向引用的错误 同一个模块?或者这是一种错误的方法?
这是我的示例代码:
from my_types import SomeXs
class X:
pass
类型别名定义如下:
# my_types.py
from typing import List
SomeXs = List['X']
当我 运行 mypy 时,我得到一个错误 X
未定义:
$ mypy module.py
my_types.py:4: error: Name 'X' is not defined
Found 1 error in 1 file (checked 1 source file)
Mypy 需要在范围内有引用类型:
$ cat my_types.py
from typing import List
from main import X
SomeXs = List[X]
并且包含 X
的代码未引用 SomeXs
,因此不应将其导入那里:
$ cat main.py
class X:
pass
结果:
$ mypy .
Success: no issues found in 2 source files
我将在这里分享我在 mypy 文档 common issues section 中找到的解决方案:mypy 必须能够访问 X
的定义。为了避免导入循环,mypy
文档推荐了一个技巧——只导入定义
类型检查时会创建循环导入。它是这样的:
from typing import List, TYPE_CHECKING
if TYPE_CHECKING:
from main import X
SomeXs = List['X']
这使得 Python 解释器在执行时忽略导入
这段代码,但 mypy 仍然使用 main
.
X
的定义
瞧瞧:
$ mypy *.py
Success: no issues found in 2 source files