Ser*_*nov 13 python annotations type-hinting python-3.x python-typing
我有两个带有注释/类型提示的类。
第一个工作没有任何问题:
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from bunyamin.models.exchange import Exchange
class Kline:
def read_klines(exchange: Exchange):
pass
Run Code Online (Sandbox Code Playgroud)
第二个确实很相似:
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
Run Code Online (Sandbox Code Playgroud)
但提出NameError: name 'Timeframe' is not defined。
我知道我可以使用字符串(如'Timeframe')而不是类本身,但据我所知这不是预期的行为。我缺少什么?
我使用的 Python 版本是 3.8.2(如果相关的话)。
编辑:
当我试图隔离问题时,我省略了所有“看似不相关”的导入。但第一个文件实际上包含from __future__ import annotations在顶部,这使得它可以工作。详情请参阅第一个答案。
Ser*_*nov 19
我得到了它。
为了隔离问题,我省略了两个类上“看似”不相关的导入。但我刚刚注意到,在第一个包含Kline类的文件中,我使用了类from __future__ import annotations,而在第二个文件中我没有使用,这推迟了注释的评估。
可以在这里找到参考:
https://www.python.org/dev/peps/pep-0563/
请注意,from __future__ import annotations必须出现在文件的顶部,否则会引发SyntaxError
ale*_*ame 11
当您使用TYPE_CHECKING常量时,函数参数注释必须用引号括起来,使其成为 \xe2\x80\x9cforward 引用\xe2\x80\x9d,以在运行时对解释器隐藏它,如timeframe: 'Timeframe'. 因为这些默认情况下在函数定义时进行评估,直到 Python 3.10 为止,延迟评估注释成为默认情况。