Python@classmethod&静态生成器返回的类型提示:NameError:未定义名称“…”

Python@classmethod&静态生成器返回的类型提示:NameError:未定义名称“…”,python,python-3.x,type-hinting,Python,Python 3.x,Type Hinting,我想为static builder和Python 3添加类型提示,即未定义类名: class Options(object): def __init__(self, path: str): self._path = path @property def path(self): return self._path class Config(object): def __init__(self, path: str):

我想为static builder和Python 3添加类型提示,即未定义类名:

class Options(object):
    def __init__(self, path: str):
        self._path = path

    @property
    def path(self):
        return self._path

class Config(object):
    def __init__(self, path: str):
        self._path = path

    @classmethod
    def from_options(cls, options: Options) -> Config:
        return cls(options.path)
在python3 1.py上返回:


类的名称在类之后才存在。。。街区尽头。如果希望将该名称用作方法的类型批注,则需要将其括在引号中:

    @classmethod
    def from_options(cls, options: Options) -> "Config":
        return cls(options.path)

在定义该类的过程中,不能使用类名。一般来说,我们不需要这样做,但是对于类型检查来说,在类自己的定义中引用类是非常有意义的。幸运的是,Python类型暗示规则对此有一个规定:。如果字符串中的内容是有效类型,则类型名称可以显示为字符串

@classmethod
def from_options(cls, options: Options) -> 'Config':
    return cls(options.path)

另一方面,您没有正确地使用classmethod。如果要使用类方法,那么应该使用cls参数,在本例中为clsoptions.path。或者让它成为一个实际的静态方法。或者用Python。。。只是一个模块级函数,它几乎总是可以作为staticmethod的一个相同用途。@juanpa.arrivillaga更新的问题。在从内存中键入的代码中提取问题时,这个打字错误滑倒了。这已经很过时了。在Python3.7+上,您应该使用from\uuuu future\uuuu导入注释。这将成为Python 3.10No中的默认行为,请使用from\uuuu future\uuuu导入注释
@classmethod
def from_options(cls, options: Options) -> 'Config':
    return cls(options.path)