你参考下这样来:NameError: name 'Position' is not defined
官方建议:使用一个字符串
只需使用字符串而不是类本身:...
def __add__(self, other: 'Position') -> 'Position':
...
还有这样的方法:转发引用
当类型提示包含尚未定义的名称时,该定义可以表示为字符串文本,稍后解析。
发生这种情况的情况通常是容器类的定义,其中定义的类出现在某些方法的签名中。例如,以下代码(简单二叉树实现的开始)不起作用:class Tree:
def __init__(self, left: Tree, right: Tree):
self.left = left
self.right = right为了解决这个问题,我们写道:class Tree:
def __init__(self, left: 'Tree', right: 'Tree'):
self.left = left
self.right = right字符串文字应该包含一个有效的Python表达式(即,compile(lit,'','eval')应该是一个有效的代码对象),并且在模块完全加载后它应该没有错误地评估。在其中进行评估的本地和全局命名空间应该是相同的命名空间,其中将对同一个函数的默认参数进行评估。
在类定义之前,放置一个伪定义:class Position(object):
pass
class Position(object):
...
这将摆脱,NameError甚至可能看起来不错:>>> Position.__add__.__annotations__
{'other': __main__.Position, 'return': __main__.Position}
但是吗?>>> for k, v in Position.__add__.__annotations__.items():
... print(k, 'is Position:', v is Position)
return is Position: False
other is Position: False
B. Monkey-patch为了添加注释:
你可能想尝试一些Python元编程魔术并编写一个装饰器来为类定义添加猴子补丁以添加注释:class Position:
...
def __add__(self, other):
return self.__class__(self.x + other.x, self.y + other.y)
装饰者应该对此负责:Position.__add__.__annotations__['return'] = Position
Position.__add__.__annotations__['other'] = Position
至少看起来是对的:>>> for k, v in Position.__add__.__annotations__.items():
... print(k, 'is Position:', v is Position)
return is Position: True
other is Position: True