Python 类型批注中未定义名称
我目前正致力于创建一个python线性代数模块,以获得乐趣并练习该语言。我最近尝试向模块添加类型注释,如下所示:Python 类型批注中未定义名称,python,python-3.x,type-hinting,Python,Python 3.x,Type Hinting,我目前正致力于创建一个python线性代数模块,以获得乐趣并练习该语言。我最近尝试向模块添加类型注释,如下所示: class Vector: # Various irrelevant implementation details def __add__(self, other: Vector) -> Vector: # More implementation details.... 但是,当我尝试导入此内容时,它会抛出一个NameError:未定义名称
class Vector:
# Various irrelevant implementation details
def __add__(self, other: Vector) -> Vector:
# More implementation details....
但是,当我尝试导入此内容时,它会抛出一个NameError:未定义名称“Vector”
。我承认这个问题已经以某种形式得到了回答,但它似乎并没有完全为我的情况提供答案
我想知道的是:
- 我已经在这个文件中定义了这个类。为什么它说这个名字没有定义
- 如何定义
,使其可用于注释(作为向量
)类型
- 您有一份远期申报;函数(绑定为方法)是在类创建之前创建的,因此名称
Vector
还不存在。只有在执行了所有的类主体之后,Python才能创建类
对象,并将名称向量
绑定到该对象
只需使用名称为的字符串即可:
class Vector:
# Various irrelevant implementation details
def __add__(self, other: 'Vector') -> 'Vector':
# More implementation details....
这不会影响IDE如何看待声明;加载整个模块后,将查找字符串,并将其解析为当前上下文中的有效Python表达式。由于类向量
一旦加载整个模块就存在,因此字符串向量
可以正确地转换为类对象
另见:
当类型提示包含尚未定义的名称时,该定义可以表示为字符串文字,稍后解析
[……]
字符串文本应该包含一个有效的Python表达式[…],并且在模块完全加载后,它的计算应该不会出错
从Python3.7开始,通过在模块顶部添加from\uuuuuu future\uuuuuuuu import annotations
指令,可以使给定模块中的所有注释的行为类似于正向注释(而不将它们包含在字符串文本中)。在Python3.10及更高版本中。看见请注意,在注释之外,您可能仍然需要使用前向引用语法(字符串文字),例如在类型别名中(就Python而言,这是一个常规变量赋值)。如果您使用的是Python 3.7及更高版本。看看
从Python 3.7开始,它将被允许,只需添加:
from __future__ import annotations
还要注意的是
它将成为Python 3.10中的默认值
请将您的帖子限制为每篇帖子一个问题。这里有两个不同的问题,一个是关于循环依赖关系(类的方法取决于创建之前的类),另一个是关于类型和类之间的区别。后者是重复的。请看我从你的帖子中删除的问题部分。对不起。我认为类型问题与手头的问题有关。谢谢。我在链接的问题中看到了字符串答案,但让我感到不舒服的是,它突出显示了带有类颜色的
other:Vector
,而不带类颜色的->Vector
,因此,当我对后一个向量进行注释时,我从不认为我需要为前者这样做。谢谢你的澄清。这很有趣。我将保留原样的答案,因为它适用于所有3.x版本(或者至少比导入注释
解决方案更适用于3.x版本),但我仍然很高兴您将其发布在这里。请确保您将此行作为模块中的第一行输入。@VladBezden确定,正如pep8所建议的:导入位于文件的顶部,未来的导入将首先进行。对于Python3.6,我发现错误未定义未来功能注释
@ShitalShah是的,因为正如答案中所说,这是Python3.7.x-4.0的一个功能。