Python 使用循环引用为注释类型创建别名时,如何避免名称错误?

Python 使用循环引用为注释类型创建别名时,如何避免名称错误?,python,python-3.x,annotations,type-hinting,Python,Python 3.x,Annotations,Type Hinting,正如所建议的,从Python 3.7开始,如果 from\uuuuu future\uuuuu导入注释 使用指令 但是,如果要为注释类型创建别名,此操作仍然无效: from\uuuuu future\uuuuu导入注释 导入键入 MyType1=typing.Union[str,MyType2] MyType2=typing.Mapping[str,MyType1] 这仍然给我提供了name错误:名称“MyType2”未定义 我知道使用字符串文字的回退语法,它确实有效。然而,我很好奇是否有可

正如所建议的,从Python 3.7开始,如果

from\uuuuu future\uuuuu导入注释
使用指令

但是,如果要为注释类型创建别名,此操作仍然无效:

from\uuuuu future\uuuuu导入注释
导入键入
MyType1=typing.Union[str,MyType2]
MyType2=typing.Mapping[str,MyType1]
这仍然给我提供了
name错误:名称“MyType2”未定义


我知道使用字符串文字的回退语法,它确实有效。然而,我很好奇是否有可能使用正式可用的新方法。

一种技术是使用。此常量在运行时始终为false,但被类型检查器(如mypy:

from __future__ import annotations
from typing import TYPE_CHECKING, Union, Mapping
if TYPE_CHECKING:
    MyType1 = Union[str, MyType2]
    MyType2 = Mapping[str, MyType1]
由于该常量在运行时为False,Python将永远不会尝试计算任何一种类型的别名,这使您可以避开NameError

当然,您需要使用
from\uuuuu future\uuuuu导入注释
指令,或者在使用任何一种类型提示时使用字符串文字类型