V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
thinkingmind
V2EX  ›  推广

技术揭秘 | Python 3.9 新特性速览

  •  
  •   thinkingmind · 2021-03-30 11:53:30 +08:00 · 888 次点击
    这是一个创建于 1370 天前的主题,其中的信息可能已经有所发展或是发生改变。

    去年国庆假期,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


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

    欢迎联系米筐量化王老师微信 RicequantCS 沟通分享更多金融技术干货,也欢迎大家进行量化产品试用。

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2835 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 14:29 · PVG 22:29 · LAX 06:29 · JFK 09:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.