在Python 中如何使用注解(annotations)

624 阅读2分钟

在 Python 中,__future__ 模块是一种特殊的机制,它允许从未来版本的 Python 引入新的语言特性。这意味着你可以在当前版本的 Python 中使用尚未广泛支持的新特性。annotations__future__ 模块中的一个特性,它改变了注解(annotations)的处理方式。

从 Python 3.7 开始,通过 from __future__ import annotations,注解不再在定义时立即求值,而是延迟到运行时。这对于处理前向引用(forward references)或避免在运行时发生的循环依赖尤为有用。

使用 __future__ 中的 annotations 的示例:

  1. 导入 __future__ 中的 annotations

    在你的 Python 脚本或模块的开头加入以下代码:

    from __future__ import annotations
    
  2. 定义注解

    接下来,当你在定义函数或类时使用注解,这些注解将被存储为字符串,而不是在定义时被求值。

    def greet(name: str) -> str:
        return "Hello, " + name
    

    在这个例子中,注解 str 用来指示 name 参数和返回类型都是字符串。

  3. 前向引用

    使用 __future__ 模块中的 annotations 特别有助于处理前向引用的情况。例如,在定义涉及尚未定义类的注解时:

    class Node:
        def __init__(self, left: Node, right: Node):
            self.left = left
            self.right = right
    

    在这个例子中,Node 类的构造函数使用了 Node 作为参数类型,即使 Node 类在这个时候还没有完全定义。在 Python 3.7 之前,这会引发错误,但通过 from __future__ import annotations,这样的代码变得合法,因为注解不会在定义时立即求值。

注意事项

  • 使用 __future__ 中的 annotations 主要是为了兼容性和减少运行时的错误。
  • 这种方式在 Python 3.10 及之后将成为默认行为,因此如果你使用的是 Python 3.10 或更新的版本,你可能不需要显式地导入这个特性。
  • 请注意,尽管注解被存储为字符串,但它们在使用类型检查工具(如 mypy)时仍然有效。