Python 3.10 有什么新变化 - 有关类型提示的新增特性

本节介绍了涉及 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 撰写。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值