我有这种形式的函数:
def foo(o: "hello") -> dict:
# pass
我理解“-> dict”意味着 foo 返回一个字典。我不明白的是“你好”部分。为什么这个类型提示以字符串形式给出?什么是“你好”?
可能相关 - 这是一个自动生成的文件。
有时需要在创建对象之前设置类型注释,例如:
class Node:
def next() -> Node:
pass
这段代码实际上失败了,因为
Node
作为Node.next
的注释被引用,而Node
类仍在创建中。这与以下失败的原因相同:
class T:
t = T()
要解决这个问题,您可以使用字符串来代替
class Node:
def next() -> 'Node':
pass
因此类型检查器只会稍后评估
Node
(前向参考)。
这实际上是决定是一个设计缺陷,因此在Python 3.7中你可以使用
from __future__ import annotations
并且第一个示例将起作用。
编辑2022年4月
自此以来,很多事情都发生了变化(但也有很多事情没有改变)。最重要的区别是字符串注释从 py 3.10 开始被推迟,并且“听起来”就像它永远不会稳定。相反,指导委员会可能最终会稳定PEP 649,它的行为稍微复杂一些,但仍然支持自引用类型提示。详情请参阅 PEP。