本节介绍了涉及 PEP 484 类型提示和 typing 模块的主要改变。
PEP 604: 新的类型联合运算符
引入了启用 X | Y 语法的类型联合运算符。 这提供了一种表示 ‘类型 X 或类型 Y’ 的相比使用 typing.Union 更清晰的方式,特别是在类型提示中。
在之前的 Python 版本中,要为可接受多种类型参数的函数应用类型提示,使用的是 typing.Union:
def square(number: Union[int, float]) -> Union[int, float]:
return number ** 2
类型提示现在可以使用更简洁的写法:
def square(number: int | float) -> int | float:
return number ** 2
这个新增语法也被接受作为 isinstance() 和 issubclass() 的第二个参数:
>>>
>>> isinstance(1, int | str)
True
详情参见 union 类型 和 PEP 604。
(由 Maggie Moss 和 Philippe Prados 在 bpo-41428 中贡献,并由 Yurii Karabas 和 Serhiy Storchaka 在 bpo-44490 中补充。)
PEP 612: 形参规格变量
在 typing 模块中新增了两个选项以改进用于 PEP 484 的 Callable 提供给静态类型检查器的信息。
第一个选项是形参规格变量。 它们被用来将一个可调用对象的形参类型转发给另一个可调用对象 —— 这种模式常见于高阶函数和装饰器。 使用示例可在 typing.ParamSpec 中找到。 在之前版本中,没有一种简单办法能以如此精确的方式对形参类型的依赖性进行类型标注。
第二个选项是新的 Concatenate 运算符。 它与形参规格变量一起使用以便对增加或移除了其他可调用对象的高阶可调用对象进行类型标注。 使用示例可以在 typing.Concatenate 中找到。
请参阅 typing.Callable, typing.ParamSpec, typing.Concatenate, typing.ParamSpecArgs, typing.ParamSpecKwargs 和 PEP 612 来了解更多细节。
(由 Ken Jin 在 bpo-41559 中贡献,并由 Jelle Zijlstra 在 bpo-43783 中加以少量改进。 PEP 由 Mark Mendoza 撰写。)
PEP 613: 类型别名
PEP 484 引入了类型别名的概念,只要求它们是不带标注的最高层级赋值。 这种简单性有时会使得类型检查器难以区分类型别名和普通赋值,特别是当涉及到前向引用或无效类型的时候。 例如在比较:
StrCache = 'Cache[str]' # a type alias
LOG_PREFIX = 'LOG[DEBUG]' # a module constant
现在 typing 模块具有一个特殊值 TypeAlias 可让你更明确地声明类型别名:
StrCache: TypeAlias = 'Cache[str]' # a type alias
LOG_PREFIX = 'LOG[DEBUG]' # a module constant
请参阅 PEP 613 了解详情。
(由 Mikhail Golubev 在 bpo-41923 中贡献。)
PEP 647: 用户自定义的类型保护器
TypeGuard 已被添加到 typing 模块用来标注类型保护器函数并改进在类型细化期间提供给静态类型分析器的信息。 要了解更多信息,请参阅 TypeGuard 的文档以及 PEP 647。
(由 Ken Jin 和 Guido van Rossum 在 bpo-43766 中贡献。 PEP 由 Eric Traut 撰写。)