返回类的类方法

Mac*_*Mac 4 python type-hinting python-3.5

我正在玩python的3.5类型提示.我想知道如何键入提示类方法的返回类型.

这就是我的想法:

>>> class A():
    @classmethod
    def a(cls) -> A:
        pass

Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    class A():
  File "<pyshell#24>", line 3, in A
    def a(cls) -> A:
NameError: name 'A' is not defined
Run Code Online (Sandbox Code Playgroud)

显然它不起作用.我想一种方法是做某种"前向声明",如下所示:

>>> class A():
    pass

>>> class A():
    @classmethod
    def a(cls) -> A:
        pass
Run Code Online (Sandbox Code Playgroud)

但这并不觉得"pythonic".人们通常如何解决这个问题?

jsb*_*eno 11

转发引用当类型提示包含尚未定义的名称时,该定义可以表示为字符串文字,稍后要解决.

https://www.python.org/dev/peps/pep-0484/#forward-references

PEP文本继续提供以下示例:

class Tree:
    def __init__(self, left: 'Tree', right: 'Tree'):
        self.left = left
        self.right = right
Run Code Online (Sandbox Code Playgroud)

除了提供字符串之外,您提出的解决方法存在问题 - 如果您这样做:

class A():
    pass

class A():
    @classmethod
    def a(cls) -> A:
        pass
Run Code Online (Sandbox Code Playgroud)

(final和real)中注释的返回值class A是在A处理类主体时携带名称的对象- 该对象是存根class A.因此,任何在静态或运行时分析中检查返回值的工具A.a()都会发现它不等于类 A.

因此,如果需要解决这个问题(我曾经需要它,我忘记了上下文 - 这与注释无关 - 啊 - 我现在回想起来:它是在一个项目中自动生成Python ctypes包装器特定的C库),方法是创建一个单独的类,然后使用赋值语句对其进行扩充.对于你的例子,那将是:

class A:
    pass

def a(self) -> A:
    pass

A.a = a
del a
Run Code Online (Sandbox Code Playgroud)

  • 从 Python 3.7 开始,现在支持前向引用,因此不再需要将其设为字符串。 (2认同)

归档时间:

查看次数:

1076 次

最近记录:

9 年,8 月 前