技术揭秘 | Python 3.9 新特性速览 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
thinkingmind
V2EX    推广

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

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

    去年国庆假期,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     Solana     2838 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 14:25 PVG 22:25 LAX 07:25 JFK 10:25
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86