当前位置: 首页 > 面试题库 >

名称未在类型注释中定义

熊烨
2023-03-14
问题内容

我目前正在创建一个有趣的python线性代数模块,并使用该语言进行实践。我最近尝试将类型注释添加到模块中,如下所示:

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

但是,当我尝试导入它时,它吐出一个NameError: Name 'Vector' is not defined。我承认这个问题已经在这里以某种形式得到了回答,但似乎并不能完全解决我的情况。

我想知道的是:

  • 我已经在该文件中按字面值定义了该类。为什么说未定义名称?
  • 如何定义Vector可用于注释的方式(作为type)?

问题答案:

您有一份前瞻性声明;函数(作为方法绑定)在类创建 之前
创建,因此名称Vector尚不存在。只有在所有类体都已执行后,Python才能创建class对象并将名称绑定到该对象Vector

只需使用带有名称的字符串即可:

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

这不会影响您的IDE看到声明的方式。加载整个模块后,将查找字符串,并在当前上下文中将其解析为有效的Python表达式。由于Vector一旦加载了整个模块,该类就存在了,因此'Vector'可以将字符串正确地转换为类对象。

另请参阅前向参考中的规范:

当类型提示包含尚未定义的名称时,该定义可以表示为字符串文字,以便稍后解析。

[…]

字符串文字应包含有效的Python表达式,并且在模块完全加载后,其值应无错误。



 类似资料:
  • 我目前正致力于创建一个python线性代数模块,以获得乐趣并练习该语言。我最近尝试向模块添加类型注释,如下所示: 但是,当我尝试导入此内容时,它会抛出一个。我承认这个问题已经在这里以某种形式得到了回答,但它似乎并没有完全为我的情况提供答案。 我想知道的是: 我已经在这个文件中定义了这个类。为什么它说这个名字没有定义

  • 问题内容: 注释如何在Jersey中工作,以将过滤器应用于特定的资源方法或资源类? 考虑以下注释: 它是如何工作的? 问题答案: 名称绑定 名称绑定 是一个概念,它允许对JAX-RS运行时说,仅针对特定的资源方法才执行特定的过滤器或拦截器。当过滤器或拦截器仅限于特定资源方法时,我们说它是 名称绑定的 。没有这种限制的过滤器和拦截器称为 global 。 定义名称绑定注释 可以使用注释将过滤器或拦截

  • 问题内容: 我对python相对较新,并且在命名空间方面遇到一些问题。 问题答案: 由于不知道是谁,因此您看到的味精应该在调用时发生(调用很好),请将其更改为:

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

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

  • 我有一个关于Spring注释的问题。在我的(学习)项目中,我定义了两个类,另一个类有两个属性,每种类型一个。为了生成一个错误,我在XML中定义了两个相同类类型的beans,并且在setter方法中使用了@Autowired注释。大概是这样的: 在主类中,我获取此 Bean 的应用程序上下文的实例,并打印覆盖 toString 方法的属性的内容,这是一个简单的测试。我已经读到Spring自动连线注释