Python3.9刚刚发布,Python3.10的第二个alpha版本也在11月初发布。通过这个版本,我们或许可以窥见Python未来的变化。Python3.10第二个alpha版本的新特性包括以下三个部分:类型注释扩展为什么类型注释很重要新方法和行为类型注释扩展Python3.9版本对类型提示和注释进行了全面修改和清理。Python3.10版本似乎延续了这一趋势,Python3.10alpha2版本扩展了类型注释功能。类型注释从Python3.0到Python3.10的变化。类型注解的惰性求值类型注解的求值总是在函数定义时执行,这意味着类型注解以自上而下的方式逐行求值。这看起来合乎逻辑,但存在两个问题:引用尚未定义的类型(前向引用)的类型提示是无效的,必须表示为字符串。例如,它应该是“int”而不是“int”(尽管这只适用于自定义类型,不适用于内置/预定义类型)。由于需要执行类型提示,模块导入速度变慢。因此,注释将存储在__annotations__中,然后集中评估,即允许前向引用并首先执行模块导入(以减少初始化时间)。联合运算符类型Python3.10引入了|操作员。你可以使用|在注释数据类型时作为OR。比如有一个变量希望是int或者float,我们可以写成int|float:在3.10之前的版本中,等价运算符是使用type.Union方法编写的,例如联合[整数,浮点数]。TypeAlias注释又回到了前向引用问题,避免前向引用的一种常见解决方案是将它们写成字符串。但是,将类型写为字符串会在将这些类型分配给变量时产生问题,因为Python假定字符串文字类型注释只是一个字符串。在使用它的地方用该类型注释一个变量将返回一个错误。例如:我们正在尝试使用MyType作为类型的别名(alias),但是MyType将被读取为字符串值,而不是类型别名。只要在后面的代码中定义了ClassName,这就是有效的。目前,这会引发注释错误。为了解决这个问题,这个版本添加了一种方法来明确地将MyType标识为类型别名:为什么类型注释很重要Python如此强大的一个原因是它易于使用和掌握,因为我们不需要使用显式定义类型。这似乎违反直觉,但允许开发人员定义类型可以大大增强代码库的可读性和可维护性。以transformers库的源代码为例:即使没有上下文,我们也可以阅读这段代码并理解应该向这些函数、类和方法提供什么数据,以及应该返回什么数据类型。在复杂的代码库(即使是简单的代码库)中,类型注释可以大大提高可读性。同时,并非每个开发人员都希望(或需要)使用类型注释,因此可选的、无异常的功能达到了完美的平衡。新方法和实现除了对类型注释的更改之外,3.10alpha2版本还对其他核心功能进行了一些更新。向Zip添加等长标记第一个是PEP618,它向zip()函数添加了一个可选的严格标记。如果zip的两个输入长度不等,请设置strict=True以引发错误。如果左侧没有strict=True标志,则不会引发错误,并且会截断更长的列表以创建紧凑的生成器。如果设置了strict=True,则会引发错误。整数的位数也称为“人口数”。这种新方法允许计算一个整数的二进制表示中1的数量,只需编写int.bit_count():字典视图映射三种字典方法dict.keys()、dict.values()和dict.items()返回字典的不同看法。现在,将映射属性添加到每个视图对象。这个新属性是一个types.MappingProxyType对象,它包装了原始字典。如果在视图上调用,则返回原始字典。
