我有两个带有注释/类型提示的类
第一个工作没有任何问题:
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'
)来代替类本身,但恐怕这不是预期的行为。我错过了什么
如果相关的话,我使用的Python版本是3.8.2
编辑:
当我试图隔离这个问题时,我忽略了所有的“看似不相关的”导入。但是第一个文件实际上在顶部包含from __future__ import annotations
,这使得它可以工作。有关详细信息,请参见第一个答案
使用
TYPE_CHECKING
常量时,函数参数注释必须用引号括起来,使其成为“正向引用”,以便在运行时向解释器隐藏它,如timeframe: 'Timeframe'
。因为在Python3.10之前,默认情况下在函数定义时对这些函数进行求值,而在Python3.10之前,对注释的延迟求值将成为默认值我明白了
为了解决这个问题,我省略了两个类中“似乎”不相关的导入。但是我刚刚注意到,在第一个包含
Kline
类的文件中,我使用了from __future__ import annotations
,而在第二个文件中我没有,这推迟了注释的计算可在此处找到参考:
https://www.python.org/dev/peps/pep-0563/
请注意
from __future__ import annotations
必须出现在文件的顶部,否则会引发SyntaxError
相关问题 更多 >
编程相关推荐