新的Python3.9给语言功能带来了“重大变化”

2020-10-11 16:54:55

今天发布的Python3.9对该语言的特性和开发方式都带来了重大变化。Python在过去几年如雨后春笋般流行,它在数据科学和机器学习等快速发展的领域中的使用也呈爆炸式增长。该项目正在努力跟上所有新需求的步伐。

到目前为止,Python已经以18个月的节奏开发和发布。PEP602建议Python开发团队采用年度发布周期,该建议已经被接受。

每年的发布周期意味着每个版本的功能更少,但这也意味着对功能测试的反馈更快,每个版本的潜在破坏性更改更少,因此对用户和Linux发行版经理来说更有动力更频繁地升级Python。这也意味着在开发周期后期提出的新功能不需要那么长时间就可以投入到新版本中。

新的时间表意味着Python3.9将于2020年10月发布。Python3.10于2020年5月19日正式启动Pre-Alpha开发,将在Python3.9发布时进入Alpha开发阶段,并将于2021年10月发布。未来的Python版本将遵循相同的模式。

与前一个版本相比,Python的每个版本都有性能改进。Python3.9引入了两个重大改进,无需对现有代码进行任何更改即可提高性能。

第一个改进涉及更多地使用Python3.8中引入的向量调用协议。Vector通过最小化或消除为调用创建的临时对象,使许多常用函数调用速度更快。在Python3.9中,几个Python内置组件-range、tuple、set、frozenset、list、dict-在内部使用Vector call来加快执行速度。

第二大性能增强是更高效地解析Python源代码。CPython运行时的新解析器不是为解决性能问题而设计的,而是为了处理原始解析器中的内部不一致。但是,一个重要的附带好处是解析速度更快,尤其是对于大量代码而言。

Python使操作常见数据类型变得容易,Python3.9通过字符串和字典的新特性扩展了这一简单性。对于字符串,有了新的方法来删除前缀和后缀,这些操作长期以来都需要大量的手动工作才能完成。对于字典,现在有联合运算符,一个用于将两个字典合并成一个新字典,另一个用于用另一个字典更新一个字典的内容。

装饰器允许您包装Python函数,以编程方式改变它们的行为。以前,修饰符只能由@符号、名称(例如func)或带点的名称(func.method)以及可选的单个调用(func.method(arg1,arg2))组成。在Python3.9中,修饰符现在可以由任何有效表达式组成。

绕过这一限制的一种长期方法是创建一个函数或lambda表达式,它在用作装饰符时代表更复杂的表达式。现在任何表达式都可以,只要它产生一些可以作为装饰符的东西。

在过去的几个版本中,Python扩展了对类型提示的支持。这主要是为了使用链接器和代码检查器;在CPython中不会在运行时强制使用类型,也没有计划将Python变成一种静态类型的语言。但是类型提示是确保大型代码库中一致性的强大工具,因此Python代码仍然可以从类型提示中获益。

Python3.9中引入了类型提示和类型注释的两个新特性。在其中之一,集合内容的类型提示-例如,列表和字典-现在在Python中本机可用。这意味着,例如,您可以将列表描述为LIST[INT]-整数的列表-而不需要类型库来执行此操作。

Python类型机制的第二个补充是灵活的函数和变量注释。这允许使用带注释的类型来使用元数据描述类型,元数据可以提前(使用linting工具)或在运行时进行检查。例如,Annotated[int,ctype(";char";)]可以用来描述在C中应该被视为char类型的整数。默认情况下,Python不会对这样的注释做任何事情,但是它可以由代码链接器使用。

清理、提炼和现代化Python的内部结构是Python开发人员正在进行的一项计划,Python3.9在这方面做了一些更改。

第一个是重新设计模块与进口机器交互的方式。用C编写的Python扩展模块现在可以使用一种新的加载机制,使它们在导入时的行为更像常规的Python模块。Python的标准库中有几个模块新支持此行为:_abc、audioop、_bz2、_codecs、_contextvars、_crypt、_functools、_json、_locale、Operator、resource、time、_winnref。新的加载机制不仅允许Python更加灵活地处理扩展模块,还支持高级挂钩行为等新功能。

第二个清理计划是CPython的稳定内部ABI,保证在Python3的生命周期内持续。从历史上看,Python的每个主要版本都与以前的版本不兼容,需要为每个新版本重新编译扩展模块。从现在开始,任何使用稳定ABI的扩展模块都将跨Python版本工作。在Python3.9中,标准库中的以下模块使用稳定的ABI:audioop、ast、grp、_hashlib、pwd、_posxsubprocess、Random、select、struct、termios、zlib。

Python的标准库现在支持IANA时区数据库。Said数据库维护良好,使用广泛,在Python的DateTime库中直接使用它将是一个很大的,呃,节省时间的方法。

新的字符串方法允许轻松删除前缀和后缀。这是常见的日常使用场景之一,它需要的样板比看起来必要的要多一点。新的.removeprefix()和.removesuffix()方法返回字符串的修改副本减去有问题的前缀或后缀,前提是它们存在于字符串中。