如何解决即使我使用 TYPE_CHECKING 导入,也会为注释获取 NameError
我有两个带有注释/类型提示的类。
第一个没有任何问题:
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from bunyamin.models.exchange import Exchange
class Kline:
def read_klines(exchange: Exchange):
pass
第二个非常相似:
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from bunyamin.models.timeframe import Timeframe
def normalize_dt(dt: datetime,timeframe: Timeframe) -> datetime: # -> This line raises NameError
pass
但是加注 NameError: name 'Timeframe' is not defined
。
我知道我可以只使用字符串(如 'Timeframe'
)而不是类本身,但 AFAIK 这不是预期的行为。我错过了什么?
我使用的 Python 版本是 3.8.2,如果相关的话。
编辑:
当我试图隔离问题时,我省略了所有“看似无关”的导入。但是第一个文件实际上在顶部包含 from __future__ import annotations
,这使它起作用。详情请参阅第一个答案。
解决方法
当您使用 TYPE_CHECKING
常量时,函数参数注释必须用引号括起来,使其成为“前向引用”,以便在运行时将其隐藏在解释器中,如 timeframe: 'Timeframe'
。因为在 Python 3.10 之前,默认情况下这些是在函数定义时计算的,当注释的延迟计算成为默认值时。
我明白了。
为了隔离问题,我省略了两个类中“看似”无关的导入。但我刚刚注意到,在包含 Kline
类的第一个文件中,我使用了 from __future__ import annotations
,而在第二个文件中我没有使用,这推迟了对注释的评估。
可以在此处找到参考:
https://www.python.org/dev/peps/pep-0563/
请注意,from __future__ import annotations
必须出现在文件的顶部,否则会引发 SyntaxError
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。