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)
| 归档时间: |
|
| 查看次数: |
1076 次 |
| 最近记录: |