python - 使用循环引用为注释类型创建别名时如何避免 NameError?

标签 python python-3.x annotations type-hinting

作为this great answer建议,从 Python 3.7 开始,如果

from __future__ import annotations

使用指令。

但是,如果我想为注释类型创建别名,这仍然不起作用:

from __future__ import annotations
import typing

MyType1 = typing.Union[str, MyType2]
MyType2 = typing.Mapping[str, MyType1]

这仍然给我 NameError: name 'MyType2' is not defined

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

最佳答案

一种技术是使用 typing.TYPE_CHECKING constant .此常量在运行时始终为假,但被类型检查器(如 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 __future__ import annotations 指令或使用字符串文字类型。

关于python - 使用循环引用为注释类型创建别名时如何避免 NameError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55401633/

相关文章:

宇宙飞船上接收消息的系统的算法设计

python-3.x - 如何在 Pyramid 框架内的请求之间缓存/内存 pandas DataFrame(昂贵的计算)?

python - 如何编写一个接受包含整数元素的元组的函数?

swift - Mapbox - calloutAccessoryControllerTapped

python - 在具有多个可迭代对象的 python 列表理解中定位条件语句

python - 为什么此 ctypes 代码不能与 Python 3.3 一起使用,但可以与 Python 2.7 一起使用?

python - django-socketio:无属性 'response_headers_list'

python - 要在应用程序之间共享的自定义对象管理器应该放在哪里?

java - Spring MVC : Having multiple @ModelAttribute in form handling action

Java – 自定义注释不会被考虑