Python 3.9中的预期内容
Python 3.9预计将于2020年10月5日星期一发布。在发布正式版本之前,开发者曾计划发布6个alpha版本、5个beta预览版和2个候选版本。
在写这篇文章的时候,第一个候选版本最近在8月11日发布。现在,我们正焦急地等待着第二个候选发布版,它可能会在9月14日发布。
所以,你可能想知道Python 3.9有什么新东西。对吗?
有一些重大的变化,将决定Python程序的工作方式。最重要的是,在这个最新版本中,你将得到一个新的解析器,它是基于**解析表达式语法(PEG)**的。同样,合并| 和更新|= 联合运算符被添加到dict中。
让我们更深入地了解一下Python 3.9所有即将到来的特性和改进。
基于PEG的新解析器
与老的LL(1)解析器不同,新的解析器有一些关键的区别,使其更加灵活和适应未来。基本上在 LL(1) 中,Python 开发者使用了几个 "黑客 "来避免它的限制。反过来,这也影响了增加新语言特性的灵活性。
PEG和基于上下文自由语法的分析器(例如LL(1))之间的主要区别是,在PEG中,选择运算符是有序的。
假设我们把这个rule: A | B | C 。
现在,在LL(1)解析器的情况下,它将生成结构,以得出A、B或C中的哪一个必须被展开的结论。另一方面,PEG将尝试检查第一个选择(例如A)是否成功。只有当A 不成功时,它才会继续下一个选择。简单地说,PEG将按照写好的顺序来检查备选方案。
对IANA时区的支持
在现实世界的应用中,用户通常只需要三种类型的时区:
- UTC
- 系统的本地时区
- IANA时区
现在,如果已经熟悉了以前版本的Python,那么你可能知道Python 3.2引入了一个类datetime.timezone 。基本上,它的主要目的是为 UTC 提供支持。
从真正意义上讲,本地时区仍然是不可用的。但是,在Python的3.0版本中,开发者改变了天真的时区语义,支持 "本地时间 "操作。
在 Python 3.9 中,他们将增加对 IANA 时区数据库的支持。大多数时候,这个数据库也被称为 "tz "或Olson数据库。所以,不要被这些术语所迷惑。
所有的IANA时区功能都装在zoneinfo模块里。这个数据库在类似Unix的操作系统中非常流行,并且广泛分布。但是,请记住,Windows使用一个完全不同的方法来处理时区。
增加了联合运算符
在以前的 Python 版本中,合并或更新两个 dicts 的效率不高。这就是为什么开发者现在引入了联合运算符,比如| 用于合并,|= 用于更新数据集。
例如,早些时候,当我们使用d1.update(d2) ,它也会修改d1 。因此,为了解决这个问题,我们必须实现一个类似于e = d1.copy(); e.update(d2) 的小 "黑客"。
实际上,我们在这里创建了一个新的临时变量来保存数值。但是,这个解决方案并不十分有效。这就是增加那些新的联合运算符的主要原因。
介绍 removeprefix() 和 removesuffix()
你有没有觉得需要一些可以轻松地从一个给定的字符串中删除前缀或后缀的函数?
现在,你可能会说,已经有一些函数如str.lstrip([chars]) 和str.rstrip([chars]) ,可以做到这一点。但是,这就是混乱的开始。实际上,这些函数的工作对象是一组字符,而不是一个子串。
所以,肯定需要一些单独的函数,可以从字符串的开头或结尾删除子串。
为removeprefix() 和removesuffix() 提供内置支持的另一个原因是,应用程序开发人员通常会自己编写这个功能以提高他们的工作效率。但是,在大多数情况下,他们在处理空字符串时都会犯错。因此,一个内置的解决方案对现实世界的应用程序是非常有帮助的。
标准集合中的类型提示泛型
你是否注意过typing 模块中的重复集合层次结构?
例如,你可以使用typing.List 或内置的list 。因此,在 Python 3.9 中,核心开发团队决定在typing 模块中增加对泛型语法的支持。该语法现在可以在该模块中的所有标准集合中使用。
这个功能的主要优点是,现在用户可以轻松地注释他们的代码。它甚至可以帮助导师以更好的方式教授Python。
增加了graphlib模块
在图中,拓扑顺序对识别工作流起着重要作用。意思是说,它遵循一个线性顺序来告诉哪个任务将在其他任务之前运行。
graphlib 模块使我们能够对一个图进行拓扑排序或排序。它主要用于可散列的节点。
Python 3.9中增强的模块
在我看来,主要的努力发生在改进现有的模块上。你可以通过以下事实来评价这一点:35个模块的庞大列表被更新以优化Python编程语言。
一些最重要的变化发生在gc,http,imaplib,ipaddress,math,os,pydoc,random,signal,socket,time, 和sys 模块。
废弃的功能
在Python 3.9版本中,大约有16个特性被废弃了。你可以从官方的Python 3.9公告中获得详细的信息。在这里,我将尝试给你一个被废弃的最重要的东西的简要概述。
如果你曾经使用过random 模块,那么你可能知道它可以接受任何可散列类型作为种子值。这可能会产生意想不到的后果,因为无法保证哈希值是否是确定性的。这就是为什么开发人员决定只接受None, int, float, str, bytes, 和bytearray作为种子值。
另外,从现在开始,你必须指定mode 参数来打开一个GzipFile 文件进行写入。
删除了什么?
总共有21个在以前版本的Python中被废弃的特性现在已经从语言中完全删除。你可以看看Python 网站上的完整列表。
谢谢你的阅读!