Python3.10的一些新特性原理分析


Posted in Python onSeptember 15, 2021

Python 3.10.0a2 版本已经于 2020-11-04 发布,因此我们可以窥见 Python 3.10 的一些新特性。这些新特性很可能会改变未来的 Python 生态系统,使其朝着更明确,更易读的方向发展,同时保持我们熟知和喜欢的易用性。

Python3.10的一些新特性原理分析

 

 

PEP 602

 

1、类型注释的进一步扩展

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.142
f(1)  # pass
f(1.5)  # pass
f('str')  # linter will show annotation error

也可以使用 typing 模块提供的关键字 Union,比如 Union[int, float]

TypeAlias 注释

回到前向引用问题,避免前向引用的常见解决方案是将它们编写为字符串。

但是,将类型写为字符串会在将这些类型分配给变量时引起问题,因为 Python 会假定我们的字符串文字类型注释只是一个字符串。

在通常使用类型注释的地方使用该类型注释变量将返回错误。例如:

MyType = "ClassName"  # ClassName is our type annotation
def foo() -> MyType:
    ...

在这里,我们试图将其 MyType 用作类型的别名 ,但是, MyType 它将被读取为字符串值,而不是类型别名。只要 ClassName 在代码的后面定义,这就是有效的。当前情况下,这将引发注释错误。

为了解决这个问题,添加了一种显式标识 MyType 为类型别名的方法 :

from typing_extensions import TypeAlias
MyType: TypeAlias = "ClassName"
def foo() -> MyType:
    ...
OR
MyType: TypeAlias = ClassName # if we have defined ClassName already
def 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,而传输的参数的长度不相等将会抛出异常,如下图所示:

Python3.10的一些新特性原理分析

新的 strict 参数不是盲目地截断不匹配的数据,而是使我们能够控制它的行为,这将使很多开发人员免于遭受麻烦。

新增整数的位计数器 int.bit_count()

此新方法使我们能够计算整数的二进制表示形式中 1 的个数,在某些场景下这个函数非常实用且高效。

Python3.10的一些新特性原理分析

上图中的结果即为整数以二进制位为 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,具体用法如下:

Python3.10的一些新特性原理分析

新的属性 mapping 的类型属于 types.MappingProxyType,是围绕原字典的一个属性,在任何视图上访问 mapping 属性,都将返回原字典。

现在就这些了,尽管我们距离 3.10 的开发时间表只有几个月的时间,但已经有很多有趣的更改,Python 的发展仍在继续,似乎还会为语言添加更多有趣的功能。

以上就是Python3.10的一些新特性原理分析的详细内容,更多关于Python3.10新特性的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Windows系统配置python脚本开机启动的3种方法分享
Mar 10 Python
Python实现TCP/IP协议下的端口转发及重定向示例
Jun 14 Python
Python实现类似jQuery使用中的链式调用的示例
Jun 16 Python
Python实现小数转化为百分数的格式化输出方法示例
Sep 20 Python
Django实战之用户认证(用户登录与注销)
Jul 16 Python
linux安装python修改默认python版本方法
Mar 31 Python
python中while和for的区别总结
Jun 28 Python
python适合人工智能的理由和优势
Jun 28 Python
python selenium爬取斗鱼所有直播房间信息过程详解
Aug 09 Python
使用Python内置模块与函数进行不同进制的数的转换
Apr 26 Python
利用Python实现某OA系统的自动定位功能
May 27 Python
python 遍历磁盘目录的三种方法
Apr 02 Python
一篇文章带你了解Python和Java的正则表达式对比
Sep 15 #Python
Python编程编写完善的命令行工具
Sep 15 #Python
python可视化之颜色映射详解
python的变量和简单数字类型详解
Sep 15 #Python
深入浅析Django MTV模式
python 进阶学习之python装饰器小结
Sep 04 #Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 #Python
You might like
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
jQuery点击弹出下拉菜单的小例子
2013/08/01 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
浅谈页面装载js及性能分析方法
2014/12/09 Javascript
javascript创建动态表单的方法
2015/07/25 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
JS实现关闭当前页而不弹出提示框的方法
2016/06/22 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
基于JS组件实现拖动滑块验证功能(代码分享)
2016/11/18 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
2016/12/20 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
2017/02/12 Javascript
使用 Node.js 实现图片的动态裁切及算法实例代码详解
2018/09/29 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
2018/11/04 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
如何根据业务封装自己的功能组件
2019/04/19 Javascript
使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)
2020/06/05 Javascript
three.js中多线程的使用及性能测试详解
2021/01/07 Javascript
Python字符串替换实例分析
2015/05/11 Python
通过Python使用saltstack生成服务器资产清单
2016/03/01 Python
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
Python读取stdin方法实例
2019/05/24 Python
Python 实现OpenCV格式和PIL.Image格式互转
2020/01/09 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
美国市场上最实惠的送餐服务:Dinnerly
2018/03/18 全球购物
日本最大美瞳直送网:Morecontact(中文)
2019/04/03 全球购物
家居饰品店创业计划书
2014/01/31 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
销售工作决心书
2015/02/04 职场文书
仰望星空观后感
2015/06/10 职场文书
PHP中->和=>的意思
2021/03/31 PHP