当前位置 : 主页 > 编程语言 > python >

python – 未在类型注释中定义的名称

来源:互联网 收集:自由互联 发布时间:2021-06-25
我正在创建一个 python线性代数模块,用于娱乐和练习语言.我最近尝试向模块添加类型注释,如下所示: class Vector: # Various irrelevant implementation details def __add__(self, other: Vector) - Vector: # Mor
我正在创建一个 python线性代数模块,用于娱乐和练习语言.我最近尝试向模块添加类型注释,如下所示:

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

但是,当我尝试导入它时,会吐出一个NameError:名称’Vector’未定义.我承认这个问题已经以here的形式得到了回答,但它似乎并没有完全为我的情况提供答案.

我想知道的是什么:

>我在这个文件中字面上定义了这个类.为什么说这个名字没有定义?
>如何以可以用于注释(作为类型)的方式定义Vector?

你有前瞻性声明;函数(作为方法绑定)是在类之前创建的,因此名称Vector尚不存在.只有当所有类主体都已执行时,Python才能创建类对象并将名称Vector绑定到它.

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

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

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

另见specification on forward references:

When a type hint contains names that have not been defined yet, that definition may be expressed as a string literal, to be resolved later.

[…]

The string literal should contain a valid Python expression […] and it should evaluate without errors once the module has been fully loaded.

网友评论