我正在创建一个 python线性代数模块,用于娱乐和练习语言.我最近尝试向模块添加类型注释,如下所示: class Vector: # Various irrelevant implementation details def __add__(self, other: Vector) - Vector: # Mor
class Vector: # Various irrelevant implementation details def __add__(self, other: Vector) -> Vector: # More implementation details....
但是,当我尝试导入它时,会吐出一个NameError:名称’Vector’未定义.我承认这个问题已经以here的形式得到了回答,但它似乎并没有完全为我的情况提供答案.
我想知道的是什么:
>我在这个文件中字面上定义了这个类.为什么说这个名字没有定义?
>如何以可以用于注释(作为类型)的方式定义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.