国庆假期,Python 社区发布了 3.9 版本的第一个 stable release。

相比于 3.8,Python 3.9 新特性众多,但不少特性与大多数 Python“使用者”(而非 CPython 的贡献者或使用 C 接口编写扩展的开发者)关系不大。

本文将站在 Python “使用者”的角度,简单介绍新特性中很可能会与各位的日常开发产生关系的几个。

字典“并集”运算符

“并集”运算符顾名思义就是给两个字典取并,并产生新的字典对象。

熟悉 collections 标准库的开发者听到这一特性想必很容易联想到 ChainMap,两者的区别是“并集”运算符会直接产生新的对象,而 ChainMap 产生的是与输入的对象相关联的视图——视图对象或输入对象的变化都会直接对对方产生影响。

字典“并集”运算符及其相对应的原地运算符的效果如图:

也许有同学会质疑“并集”运算符的意义,毕竟使用如下的写法也能相对简洁地合并字典:

就笔者的理解(且不提上述三种写法有多少开发者能够想到),“并集”运算符的优势在于不会丢失参与合并字典的类型信息,且对字典键的类型没有要求;

此外,经过简单测试,“并集”运算符在性能上也更有优势。

类型提示的改善

Python 3.9 为内置的以及标准库中的集合类型提供了用于类型提示中的泛型的支持。如:

这一支持解决了一直以来 Python 代码中会出现两种 list(list 和 typing.List)类型的尴尬情况。需要注意的是,泛型化的内置类型仍然支持实例化,但不能被用于 isinstance 和 issubclass 判断,这一设计应该 Python 社区是结合了代码表意性和性能作出的综合考量:

此外,typing 库加入了新的类型 Annotated,通过使用 Annotated,开发者可以为内置的或自定义的类型附加更多的信息。

一种可能的使用场景:Annotated 中的类型信息供 IDE 或 代码审查工具静态地检查变量类型,而附加的信息则可以在运行时产生更丰富的作用——PEP 593 中展示了一个类似的例子。

查看PEP 593:

https://www.python.org/dev/peps/pep-0593/#combining-runtime-and-static-uses-of-annotations

装饰器语法更加灵活

旧版本的 Python 对装饰器的语法有所限制,Python 3.9 将这一限制放宽——任意“表达式”均可用在装饰器中。

如果读者对“任意表达式”这一概念感到模糊,可以参考 if 或 while 语句,在 Python 3.9 中,任意可以用在 if 或 while 测试部分的语句都可以成为装饰器而不会产生语法错误。

如下图所示,甚至匿名函数也可以直接作为装饰器(虽然图中的做法毫无意义,在此仅仅为了演示语法特性),在 Python 3.8 或之前的版本中,这样的写法会引发 SyntaxError。

PEP-614 为我们展示了一个更有实用价值的例子 —— 在编写 PyQt5 代码时为按钮列表中的每个元素分别注册事件。

查看PEP 614:

https://www.python.org/dev/peps/pep-0614/#motivation

classmethod 支持包装其他描述器

Python3.9 中的 classmethod 函数增加了对包装其他描述器(descriptor)的支持。

如下图所示,现在我们可以结合 classmethod 和 property 轻松创造出一个类的属性(在 3.8 及之前的版本中,开发者需要手工实现一个描述器以支持类似的功能)。

新增模块、函数、方法

包括且不限于:

  • 标准库中添加了时区数据库模块 zoneinfo
  • 内置的字符串类型加入了新的掐头去尾方法 removeprefix 和 removesuffix
  • math 模块中新增了多个数学运算函数

参考资料

1.Python.org

2.Python Enhancement Proposals (PEPs)

3.Python Documentation

4. Ricequant

上文中介绍的特性仅仅是 Python 3.9 更新中的冰山一角,想要更全面地了解 Python 3.9,您可以:

Python 3.9 新特性速览的更多相关文章

  1. golang1.16新特性速览

    今天是假期最后一天,明天起大家也要陆续复工了.golang1.16也在今天正式发布了. 原定计划是2月1号年前发布的,不过迟到也是golang的老传统了,正好也趁着最后的假期快速预览一下golang1 ...

  2. Python 3.8 新特性来袭

    Python 3.8 新特性来袭 Python 3.8是Python语言的最新版本,它适合用于编写脚本.自动化以及机器学习和Web开发等各种任务.现在Python 3.8已经进入官方的beta阶段,这 ...

  3. C# 9.0 新特性预览 - 类型推导的 new

    C# 9.0 新特性预览 - 类型推导的 new 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大 ...

  4. C# 9.0 新特性预览 - 空参数校验

    C# 9.0 新特性预览 - 空参数校验 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大家展示它 ...

  5. C# 9.0 新特性预览 - 顶级语句

    C# 9.0 新特性预览 - 顶级语句 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大家展示它们 ...

  6. C# 9.0 新特性预览 - init-only 属性

    C# 9.0 新特性预览 - init-only 属性 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章 ...

  7. ActiveReports 11 新特性速递

    又到了一年一度,翘首期盼的ActiveReports11 即将发布,ActiveReports 10 表控件横空出世,成为中国式复杂报表的救星后,ActiveReports11 又会有哪些令人惊奇的新 ...

  8. Windows Phone 8.1SDK新特性预览

    前言    Windows Phone 8.1的预览版将在近期推送,WP 8.1的SDK也已经进入到RC阶段,可以从这里安装.本次更新的SDK被直接集成到了VS2013Update2里面,不再是单独的 ...

  9. avalon1.3的新特性预览

    avalon1.2的性能优化风暴很快就告一段落,入职也快一个月了,许多乱七八糟的事也少了下来,估计未来一个月会有许多好东呈现给大家. 首先是一个性能检测工具.由于MVVM是将原本由人脑干的事,转到各种 ...

随机推荐

  1. Unity坑之 传递默认枚举类型参数

    今天在编写一个通用模块的时候,遇到一个奇怪的问题,vs编译时没有任何问题,但是轮到unity编译时,却报错: error CS0103: The name `PrintInt' does not ex ...

  2. 初级知识点一——C#中的值类型与引用类型

    从C#语言的定义中可以知道,C#支持两种值类型,分别是 值类型和引用类型,那么两者的区别到底在哪儿呢? 值类型特点: 1. 值类型包含 a 预定义的值类型 b 用户自定义的值类型(struct) 2. ...

  3. 什么是Nginx -九五小庞

  4. linux下P2P协议(BitTorrent)-libtorrent库编译,测试

    1.libtorrent 简介,下载和编译 libtorrent简介 libtorrent是功能齐全的C ++ bittorrent的p2p协议实现,专注于效率和可伸缩性.它可以在嵌入式设备和台式机上 ...

  5. 编程体系结构(02):Java异常体系

    本文源码:GitHub·点这里 || GitEE·点这里 一.异常简介 优秀的程序代码,都在追求高效,安全,和低错误率,但是程序中的异常是无法避免的,降低异常出现的频率是关键,异常出现如何处理是另一个 ...

  6. 目标检测中的IOU和CIOU原理讲解以及应用(附测试代码)

    上期讲解了目标检测中的三种数据增强的方法,这期我们讲讲目标检测中用来评估对象检测算法的IOU和CIOU的原理应用以及代码实现. 交并比IOU(Intersection over union) 在目标检 ...

  7. Java中nextInt和nextLine同时使用出现的问题

    代码: package com.ins1; import java.util.*; public class test { public static void main(String[] args) ...

  8. Windows安装tensorflow教程 GPU版

    PS:这是GPU版本,CPU版会用笔记本环境另写一篇博客. 前置准备 查看GPU型号 电脑桌面->右键我的电脑->选择管理->点击设备管理器  如下图: 如果不是英伟达显卡,那么不用 ...

  9. 备忘录:SQL SERVER2014 出现:“Cannot find one or more components”

    目录 1. 起因 2. 解决方案 3. 备注 4. 参考 2020年9月13日 00:40:09-shanzm 1. 起因 因为卸载vs2015的时候,使用了一个VS2013/2015卸载工具Tota ...

  10. liunx配置本地yum源和更新aliyun yum源

    1.挂载DVD光盘到/mnt   因为配置时候路径名里面不能有空格,否则不能识别 [root@ mnt]# mount   /dev/cdrom   /mnt [root@ mnt]# umount ...