Python 类型提示以字符串形式给出?

问题描述 投票:0回答:1

我有这种形式的函数:

def foo(o: "hello") -> dict:
    # pass

我理解“-> dict”意味着 foo 返回一个字典。我不明白的是“你好”部分。为什么这个类型提示以字符串形式给出?什么是“你好”?

可能相关 - 这是一个自动生成的文件。

python python-typing
1个回答
32
投票

有时需要在创建对象之前设置类型注释,例如:

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。

© www.soinside.com 2019 - 2024. All rights reserved.