python class return 类型中的函数注解是 class raise undefined

python function annotation in class return type is the class raise undefined

Python 3.6.1、类型提示有几种方式,在doc string或annotation中。我怎样才能使用注释实现这一点?

假设我有一个 class,它有一个 class 方法 load 从某处加载数据,例如 json 或数据库,并构造和 return 这个 class.

的一个实例
class Foo:

    @classmethod
    def load(cls, bar) -> Foo:
        pass

我认为这很简单,但是 python 解释器报错说 Foo 没有定义。

我知道原因,因为python加载Foo的load函数签名时,Fooclass的定义还没有完成,所以Foo还没有定义

这是函数注解的缺点吗?我能不能找到一些方法来实现这个目标,而不是使用 doc string 来键入提示,因为我真的很喜欢函数注释的清晰度。

您可以为 forward references:

使用字符串文字
import typing


class Foo:

    @classmethod
    def load(cls, bar) -> 'Foo':
        pass


class Bar:

    @classmethod
    def load(cls, bar) -> Foo:
        pass


print(typing.get_type_hints(Foo.load))  # {'return': <class '__main__.Foo'>}
print(typing.get_type_hints(Bar.load))  # {'return': <class '__main__.Foo'>}

从 Python 3.7 开始,如果您选择加入“延迟评估”行为(请参阅 PEP 563),则无需 将其设为字符串即可 有:

from __future__ import annotations