当前位置: 首页 > 知识库问答 >
问题:

类型注释[重复]中未定义的名称

吕鸿文
2023-03-14

我目前正致力于创建一个python线性代数模块,以获得乐趣并练习该语言。我最近尝试向模块添加类型注释,如下所示:

class Vector:
     # Various irrelevant implementation details
     def __add__(self, other: Vector) -> Vector:
        # More implementation details....

但是,当我尝试导入此内容时,它会抛出一个NameError:未定义名称“Vector”。我承认这个问题已经在这里以某种形式得到了回答,但它似乎并没有完全为我的情况提供答案。

我想知道的是:

  • 我已经在这个文件中定义了这个类。为什么它说这个名字没有定义

共有2个答案

丘浩宕
2023-03-14

如果您使用的是Python 3.7及以上版本。看看注释的延迟评估

从Python 3.7开始,它将被允许,只需添加

from __future__ import annotations

还要注意的是

它将成为Python 3.10中的默认值。

易俊驰
2023-03-14

你有一份远期申报单;函数(绑定为方法)是在类创建之前创建的,因此名称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及更高版本中,这已成为默认行为。参见PEP 563——推迟的注释评估。请注意,在注释之外,您可能仍然需要使用前向引用语法(字符串文本),例如在类型别名中(就Python而言,这是一个常规变量赋值)。

 类似资料:
  • 问题内容: 我目前正在创建一个有趣的python线性代数模块,并使用该语言进行实践。我最近尝试将类型注释添加到模块中,如下所示: 但是,当我尝试导入它时,它吐出一个。我承认这个问题已经在这里以某种形式得到了回答,但似乎并不能完全解决我的情况。 我想知道的是: 我已经在该文件中按字面值定义了该类。为什么说未定义名称? 如何定义可用于注释的方式(作为)? 问题答案: 您有一份前瞻性声明;函数(作为方法

  • 我使用com.google.gson.annotations.SerializedName,其中包含gson docs中提到的元素"value"和"备用",但编译器表示错误:"属性备用未定义注释类型SeriazedName"。

  • 错误在最后一行,我想知道到底出了什么问题,以及如何修复它,谢谢!

  • 为什么会这样?名称不应该是未定义的,因为没有给它赋值吗? 如果我尝试相同的,让我们说,它将分配它是未定义的。是一个特殊的关键字还是什么? 谢谢你。

  • 我正在尝试创建一个自定义注释。我有这样的注释: 我有一个方面的切入点: 但我得到了这个错误,我不明白为什么: org.springframework.security.config.annotation.configuration.objectPostProcessorConfiguration':bean初始化失败;嵌套异常为java.lang.IllegalArgumentException:

  • 我试图使用python3类型注释功能。 以下是一些没有注释的玩具函数: 这些很好用。但一旦我为添加了一些注释,就会出现错误: 为什么会发生这种情况?我该如何解决?