获取注释的NameError,即使我使用类型\检查导入

2024-05-14 09:43:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个带有注释/类型提示的类

第一个工作没有任何问题:

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,这使得它可以工作。有关详细信息,请参见第一个答案


Tags: fromimporttypingifexchangemodelsdeftype
2条回答

使用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

相关问题 更多 >

    热门问题