Python3.10的一些新特性原理分析
Python 3.10.0a2 版本已经于 2020-11-04 发布,因此我们可以窥见 Python 3.10 的一些新特性。这些新特性很可能会改变未来的 Python 生态系统,使其朝着更明确,更易读的方向发展,同时保持我们熟知和喜欢的易用性。
文章图片
PEP 602
1、类型注释的进一步扩展
【Python3.10的一些新特性原理分析】3.9 版对 Python 中的类型提示和注释进行了大幅度修改和清理,类型提示这似乎是一种持续的趋势,在 3.10 中得到进一步扩展,目的很明显,是为了更好的可读性,无需看代码即可得知变量和函数返回值的类型。
延迟类型注释的执行
类型注释的运行通常被认为是在函数定义时执行,这意味着类型注释以自上而下的方式逐行进行检查。
尽管看起来合乎逻辑,但是这样做有两个问题:
- 1、引用尚未定义的类型的类型提示(前向引用)将不起作用,必须以字符串形式表示。也就是说:假如 int 是自定义类型,我们需要编写 "int" 而不是编写 int 。
- 2、这会减慢模块导入的速度,因为此时会执行类型提示。
__annotations__
中,如果需要这些类型注释可以在运行时通过 typing.get_type_hints()
来解析,也可以通过inspect.signature()
来立即进行解析,这样的好处是可以先执行模块导入,允许前向引用,从而减少初始化时间。新增类型注释联合操作符
3.10 通过 "|" 作为逻辑或操作符。在注释数据类型时,我们可以使用 | 作为或。例如,我们有一个预期为 int 或 float 的变量,可以写为 int | float ,如下所示:
def f(x: int | float) -> float:return x * 3.142f(1)# passf(1.5)# passf('str')# linter will show annotation error
也可以使用 typing 模块提供的关键字 Union,比如 Union[int, float]
TypeAlias 注释
回到前向引用问题,避免前向引用的常见解决方案是将它们编写为字符串。
但是,将类型写为字符串会在将这些类型分配给变量时引起问题,因为 Python 会假定我们的字符串文字类型注释只是一个字符串。
在通常使用类型注释的地方使用该类型注释变量将返回错误。例如:
MyType = "ClassName"# ClassName is our type annotationdef foo() -> MyType:...
在这里,我们试图将其 MyType 用作类型的别名 ,但是, MyType 它将被读取为字符串值,而不是类型别名。只要 ClassName 在代码的后面定义,这就是有效的。当前情况下,这将引发注释错误。
为了解决这个问题,添加了一种显式标识 MyType 为类型别名的方法 :
from typing_extensions import TypeAliasMyType: TypeAlias = "ClassName"def foo() -> MyType:...ORMyType: TypeAlias = ClassName # if we have defined ClassName alreadydef foo() -> MyType:...
这里说下,为什么类型很重要,尽管这当然不是一个巨大的变动,但是看到 Python 开发人员加倍努力以增强类型功能,这真是太酷了。Python 的优势在于其易用性和缺乏陡峭的学习曲线。原因之一是不需要在我们的代码中显式定义类型。
增强类型注释看起来似乎违反直觉,但是为开发人员 提供定义类型的选项 可以极大地提高代码库的可读性和可维护性。例如,从 Python transformers 库的源代码中可以看到以下说明:
Even without context, we can read this code and immediately grasp what data we should expect to be fed into these functions, classes, and methods — and exactly which datatypes we should be expecting to return.意思是即使没有上下文,我们也可以阅读此代码,并立即掌握应将哪些数据期望输入到这些函数,类和方法中,以及确切地期望返回哪些数据类型。
In complex code bases (and even simple ones), type annotation can massively improve readability. Simultaneously, not everyone will want (or need) to use them — so an optional, exception-free functionality strikes a perfect balance.
但在复杂的代码库(甚至简单的代码库)中,类型注释可以大大提高可读性。同时,并不是每个人都希望(或需要)使用它们,因此,这是可选的。这种无异常的功能可以达到完美的平衡。
这些改进表明 Python 对类型注释功能的承诺,基于此,我们最喜欢的库和我们自己写的代码可以大大提示可阅读性,这会对 Python 生态系统产生长期的正面影响。
2、新增的函数及函数参数的变化 除了类型提示功能的扩展外,核心 Python 功能进行了一些更新,如下。
函数 zip() 增加 strict 参数
函数 zip() 增加 strict 参数,如果设置 strict = True,而传输的参数的长度不相等将会抛出异常,如下图所示:
文章图片
新的 strict 参数不是盲目地截断不匹配的数据,而是使我们能够控制它的行为,这将使很多开发人员免于遭受麻烦。
新增整数的位计数器 int.bit_count()
此新方法使我们能够计算整数的二进制表示形式中 1 的个数,在某些场景下这个函数非常实用且高效。
文章图片
上图中的结果即为整数以二进制位为 1 的个数:
0= 00000000字典的视图增加一个属性
1= 00000001
2= 00000010
3= 00000011
10= 00001010
11= 00001011
12= 00001100
100 = 01100100
101 = 01100101
102 = 01100110
字典类型的 3 个方法:dict.items()、dict.keys()、dict.values() 分别返回字典的 3 个视图,现在每个视图都增加来一个属性,叫 mapping,具体用法如下:
文章图片
新的属性 mapping 的类型属于 types.MappingProxyType,是围绕原字典的一个属性,在任何视图上访问 mapping 属性,都将返回原字典。
现在就这些了,尽管我们距离 3.10 的开发时间表只有几个月的时间,但已经有很多有趣的更改,Python 的发展仍在继续,似乎还会为语言添加更多有趣的功能。
以上就是Python3.10的一些新特性原理分析的详细内容,更多关于Python3.10新特性的资料请关注脚本之家其它相关文章!
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量