我正在玩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
显然它不起作用。我想有一种方法是像这样做某种“前瞻性声明”:
>>> class A():
pass
>>> class A():
@classmethod
def a(cls) -> A:
pass
但这并不觉得“pythonic”。人们通常如何解决这个问题?
答案 0 :(得分:11)
转发引用当类型提示包含尚未包含的名称时 定义了,该定义可以表示为字符串文字,to 稍后解决。
https://www.python.org/dev/peps/pep-0484/#forward-references
PEP文本继续提供以下示例:
tr2
除了提供字符串之外,您提出的解决方法存在问题 - 如果您这样做:
class Tree:
def __init__(self, left: 'Tree', right: 'Tree'):
self.left = left
self.right = right
(final和real)class A():
pass
class A():
@classmethod
def a(cls) -> A:
pass
中注释的返回值是在处理类主体时携带class A
名称的对象 - 该对象是存根{{1} }。因此,任何在静态或运行时分析中检查A
的返回值的工具都会发现它不等于类class A
。
所以,如果需要解决这个问题(我曾经需要它一次,我忘记了上下文 - 它与注释无关 - 啊 - 我现在回想起来:它是在一个自动生成Python ctypes的项目中特定C库的包装器,方法是创建一个单独的类,然后使用赋值语句扩充它。对于你的例子,那将是:
A.a()