名称未在类型注释中定义

发布于 2021-01-29 19:18:39

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

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

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

我想知道的是:

  • 我已经在该文件中按字面值定义了该类。为什么说未定义名称?
  • 如何定义Vector可用于注释的方式(作为type)?
关注者
0
被浏览
53
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

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

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

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

    另请参阅前向参考中规范

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

    […]

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看