Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
原作:JakeEdge
译者:豌豆花下猫@Python猫
英文:https://lwn.net/Articles/819853/
随着Python3.9.0b1的发布,即开发周期中计划的四个beta版本的首个,Python3.9的功能已经是完善了。在10月发布最终版本之前,还会有许多测试和稳定性方面的工作要做。
(译注:beta1版本发布于5月18日,作者文章写于5月20,而到本篇译文发布时,beta2刚好在今天即6月9日发布,这是一个巧合!)
该发布说明中列出了被3.9接受的7个Python增强提案(PEP)。我们研究了其中的一些PEP,看到有一些更新。现在似乎是一个介绍Python3.9带来的一些东西的好时机。
1、字符串操作
有时最简单(表明上的)的事情最困难,或者至少会引起巨大的讨论。其中大部分的争议是关于命名(还能是什么?),但是给标准字符串对象添加函数,来删除前缀和后缀,这种想法是毫无争议的。
是否可以将那些词缀(前缀和后缀的统称)指定为序列,以便在一次调用中处理多个词缀,这一点尚不明确,最后它被从提案中删除了,等待着其他人再次推动更改。
在3月底,DennisSweeney在python-dev邮件列表上请求核心开发者支持PEP616(“字符串删除前缀和后缀的方法”)。他指出了自2019年3月以来关于该话题的python-ideas讨论。埃里克·史密斯(EricV.Smith)同意支持该PEP,这促使Sweeney发布并启动了讨论。
在最初版本中,他使用cutprefix()和cutsuffix()作为要添加给字符串对象的方法名。四种类型的Python对象将获得新的方法:str(Unicode字符串),byte(二进制序列),bytearray(可变的二进制序列)和collections.UserString(字符串对象的一种封装)。
它的写法如下:
'abcdef'.cutprefix('abc')#返回'def' 'abcdef'.cutsuffix('ef')#返回'abcd'
针对命名部分,出现了一大堆的建议。基本上很少有人喜欢“cut”,因此“strip”、“strim”和“remove”被提出来了,并且都获得了一些支持。
stripprefix()以及stripsuffix()由于PEP中指出的一种理由,至少是被部分地反对了;现有的“strip”函数令人困惑,因此应避免重用该名称。
str.lstrip()和str.rstrip()方法也用于删除前导字符和尾随字符,但是它们对于真正在寻找cutprefix()功能的程序员来说是一个困惑的来源。
*strip()在调用时接收一个字符串参数,但会将其视为一组字符,并从字符串开头或结尾消除:
'abcdef'.lstrip('abc')#返回“def”,符合预期 'abcbadefed'.lstrip('abc')#返回'defed',完全不符合预期
最终,removeprefix()和removesuffix()似乎占据了上风,这正是Sweeney最终改成的版本。GuidovanRossum也支持这些名字。
埃里克·法格伦(EricFahlgren)这样搞笑地总结了命名的争论:
我认为如果你先写文档,则名称的选择会更容易些:
- cutprefix-删除指定的前缀。
- trimprefix-删除指定的前缀。
- stripprefix-删除指定的前缀。
- removeprefix-删除指定的前缀。废话:)
Sweeney更新了PEP,回应了许多评论,但还增加了提议将字符串元组作为词缀的功能(可以在PEPGitHub仓库中看到该版本)。
但是史蒂文·达普拉诺(StevenD'Aprano)不确定这样做是否合理。他指出,唯一接受元组参数的字符串操作是str.startswith()和str.endswith(),而它们不返回字符串(只是一个布尔值)。他怀疑添加这一种接收元组参数却返回字符串的方法,因为无论选择何种规则来处理元组,对于某些人来说都是“错误的”选择。
例如:
这里的困难在于,如果两个或多个前缀都能匹配,则“剪切这些前缀中的一个”的概念是模棱两可的。对startwith没有区别:
"extraordinary".startswith(('ex','extra'))
因为是从左到右,从最短到最大,甚至是随机顺序匹配都为True。但是对于cutprefix,应该删除哪个前缀?
如他所说,建议的规则是使用从左到右处理元组的第一个匹配字符串,但是有些人可能想要最长的匹配或最后一个匹配;这一切都取决于使用的上下文。他建议在提交添加此类行为之前,要给该功能更多的“浸泡时间”(译注:即预备时间):“在添加多前缀/后缀的支持之前,我们首先应该对简单的情况进行一些实际的体验。”
伊桑·弗曼(EthanFurman)同意达普拉诺(D'Aprano)的意见。但是维克托·斯汀纳(VictorStinner)强烈赞成元组参数的想法,只不过,他还想知道当传入的元组有空字符串时,会怎么处理。根据PEP提议,在处理元组时遇到空字符串(实际上可以匹配任何内容)只会返回原始字符串,这会导致令人惊讶的结果:
cutsuffix("HelloWorld",("","World"))#返回"HelloWorld" cutsuffix("HelloWorld",("World",""))#返回"Hello"
这个例子不太明显;词缀不一定是硬编码的,因此空字符串可能会溜进意想不到的位置。Stinner建议如果遇到空字符串,则抛出ValueError,类似于str.split()。但是Sweeney决定完全删除元组参数功能,以便“允许对此有更强见解的人在另外的PEP中提出并捍卫一系列的语义”。他在3月28日发布了该PEP的最新版本。
4月9日,Sweeney发起了一个指导委员会issue,请求对其PEP进行评审。4月20日,Stinner代表委员会接受了该提案。
这是一个很小的更改,但值得花时间确保它具有长期适用的接口(和语义)。我们将在Python3.9中看到removeprefix()和removesuffix()。
2、新解析器
并不令人感到惊讶的是,指导委员会已经接受了我们在4月中旬介绍过的CPython新解析器。PEP617(“CPython新的PEG解析器”)由Python创始人即前仁慈的独裁者(BDFL)GuidovanRossum以及PabloGalindoSalgado和LysandrosNikolaou共同提出。
它已经运行良好,并且在现有解析器的速度和内存使用方面提升了10%以内的性能。由于解析器是基于解析表达语法(PEG),因此也将简化语言规范。CPython现有的LL(1)解析器存在诸多缺点和一些hack,新的解析器将会消除掉。
这一更改为Python超越LL(1)语法铺平了道路,尽管现有语言并不完全是LL(1)。这一更改不会太快,因为计划是在Python3.9的命令行中提供开关,保持现有解析器可用。
但是Python3.10将删除现有的解析器,这可能会导致语言变更。如果做了那些更改,那么,其它的Python实现(例如PyPy和MicroPython)就需要切换解析器的LL(1)实现,以便跟上语言规范的要求。这可能会使核心开发者暂停进行此类更改。
3、更多内容
我们在三月初查看了PEP615(“在标准库中支持IANA时区数据库”)。它将在标准库中添加一个zoneinfo模块,该模块将有助于从IANA时区数据库中(也称为“Olson数据库”)获取时区信息,以填充时区对象。在撰写本文时,它看起来很顺利。
在3月底,PaulGanssle请求就该PEP作出决议。他认为在一个有趣的时间范围内接受它,可能会很有趣:
...我希望(出于异想天开的原因)在4月5日(星期日)UTC时间02:00-04:00或13:00-17:30之间接受它,因为这些时间代表着地球上某些地方的不明确时间(主要在澳大利亚)。还有另一个时机,那就是在4月19日星期日UTC01:00-03:00之间,这段时间在西撒哈拉是不明确的。
他意识到这可能难以实现,它当然不是优先考虑的事。指导委员会没有错过第二个时间窗太多;BarryWarsaw于4月20日宣布接受该PEP。
Python现在将具有一种机制来访问系统的时区数据库,以创建和处理时区。另外,Python软件包索引(PyPI)中有一个tzdata模块,它为缺少IANA数据的系统提供这些数据;它将由Python核心开发者维护。
PEP593(“灵活的函数和变量注释”)添加了一种将上下文特定的(context-specific)元数据与函数和变量关联的方法。实际上,typehint注解已挤出了很多年前在Python3.0中实现的PEP3107(“函数注释”)中设想的其它用例。PEP593使用注解的(Annotated)类型提示为这些用例创建了一种新的机制。
PEP585(“标准集合中的类型提示泛型”)提供了另一种清除方法。它将允许删除在typing模块中维护的一组并行的类型别名,以支持泛型。例如,type.List类型将不再需要支持诸如“dict[str,list[int]]”之类的注解(例如,一个带有字符串键和整数列表的值的字典)。
字典“加法”的联合操作也会是Python3.9的一部分。它曾不时引起争议,但是2月中旬,PEP584(“给字典添加联合操作符”)被VanRossum推荐采纳。指导委员会迅速同意了,该特性于2月24日合入。
最后一个PEP是PEP602(“Python的年度发布周期”)。如提案所书,它将发布节奏从每18个月更改为每年一次。但是,开发和发布周期是重叠的,因此整个功能开发需要12个月的时间。当第一个Python3.9beta版本发布时(即现在),Python3.10的功能开发就开始了。请继续关注来年的下一轮PEP。
到此这篇关于Python3.9beta2版本发布了,看看这7个新的PEP都是什么的文章就介绍到这了,更多相关Python3.9beta2版本新PEP内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!