我目前正在创建一个 python 线性代数模块,以供娱乐和练习该语言。我最近尝试向模块添加类型注释,如下所示:
class Vector:
# Various irrelevant implementation details
def __add__(self, other: Vector) -> Vector:
# More implementation details....
但是,当我尝试导入它时,它会输出一个NameError: Name 'Vector' is not defined
。我承认这个问题已经以某种形式得到了回答,here https://stackoverflow.com/questions/27461035/function-annotation-in-python-3-get-name-not-defined-error,但它似乎并没有完全为我的情况提供答案。
我想知道的是:
- 我已经在这个文件中按字面定义了该类。为什么说名称未定义?
- 我如何定义
Vector
以这样的方式它可以用于注释(作为type
)?
您有一份前瞻性声明;创建函数(作为方法绑定)before班级是,所以名字Vector
还不存在。只有当所有类体都执行完毕后,Python 才能创建class
对象并绑定名称Vector
to it.
只需使用带有名称的字符串即可:
class Vector:
# Various irrelevant implementation details
def __add__(self, other: 'Vector') -> 'Vector':
# More implementation details....
这不会影响您的 IDE 如何查看声明;加载整个模块后就会查找字符串,并将其解析为当前上下文中的有效 Python 表达式。自从上课以来Vector
一旦整个模块加载就存在,字符串'Vector'
可以正确转换为类对象。
另请参阅前向引用规范 http://legacy.python.org/dev/peps/pep-0484/#forward-references:
当类型提示包含尚未定义的名称时,该定义可能会表示为字符串文字,以便稍后解析。
[...]
字符串文字应包含有效的 Python 表达式 [...],并且一旦模块完全加载,它的计算结果应该不会出现错误。
从 Python 3.7 开始,您可以通过添加from __future__ import annotations
指令位于模块顶部。最初计划将此设置为 Python 3.10 及更高版本中的默认设置,但此决定现已无限期推迟。看PEP 563——推迟对注释的评估 https://www.python.org/dev/peps/pep-0563/了解详情。注意outside对于注释,您可能仍然需要使用前向引用语法(字符串文字),例如在类型别名中(就 Python 而言,这是常规变量赋值)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)