就在几个月前,我们看到了 Python 3.13引入了Free-Threaded Python,允许开发者在安装时选择不使用GIL。GIL(Global Interpreter Lock)确保同一时间只有一个线程可以访问底层内存,从而保证线程安全。然而,这也限制了多线程程序在多核CPU上的并行执行能力。通过启用Free-Threaded Python,开发者可以在所有可用的核心上运行多线程Python代码,显著提升性能。
而现在Python 3.14 预发布版本已经发布。这是 Python 社区计划的 7 次发布中的第 3 次 alpha 版本。3.14 有一些重大改进,我将在这里列出这些更新。以下是 Python 3.14 发布的五大新特性。
1. 重新加载 Python 环境
os.environ
和 os.environb
保存了 Python 程序开始时定义的缓存环境变量。
当这些环境变量在 Python 脚本外部被更新时,就会出现挑战。
我们都知道 Python 开发者喜欢挑战。Python 社区一直在努力解决这个问题,现在有了好消息。
Python 3.14 中 os
模块的最新更新之一是提供了一个新添加的内置函数 os.reload_environ()
,可以使用它来更新 os.environ
的最新值。
下面是它的使用方法:
Python 3.14.0a3 (tags/v3.14.0a3:401bfc6, Dec 17 2024, 10:58:10) [MSC v.1942 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ = os.reload_environ()
现在,开发者可以使用 reload_environ()
方法更新 os.environ
的最新值。
注意:reload_environ()
函数不是线程安全的。在另一个线程正在修改环境时调用它,行为是未定义的。
2. 不再急切地解析注解
在深入探讨这个特性之前,让我们先回答一个非常重要的问题:
什么是注解?
Python 中的 注解 是代码的一部分,提供元数据并启用类型提示。注解提供了关于变量、函数参数和返回值的信息。
例如:
>>> def addition(num1: int, num2: float) -> float:
... return num1 + num2
上面的 addition()
使用注解定义了参数和返回类型。
以前,Python 会急切地解析注解。现在,这一情况已经改变。
从 Python 3.14 发布开始 —— 注解被存储在特殊用途的 注解函数 中,并且只有在需要时才会被解析。
这有什么帮助呢?
这一变化旨在使 Python 中的注解在大多数情况下更具性能和可用性。
新的 annotationlib 模块提供了检查延迟注解的工具。
注解可以按照以下三种格式进行评估:
- VALUE — 评估注解为运行时值,类似于早期 Python 版本中的行为
- FORWARDREF — 此格式用特殊标记替换未定义的名称
- STRING — 此格式将注解作为字符串返回
下面的示例展示了这些格式的行为:
>>> from annotationlib import get_annotations, Format
>>> def func(arg: Undefined):
... pass
...
>>> get_annotations(func, format=Format.VALUE)
Traceback (most recent call last):
File "<python-input-10>", line 1, in <module>
get_annotations(func, format=Format.VALUE)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\varun\AppData\Local\Programs\Python\Python314\Lib\annotationlib.py", line 707, in get_annotations
ann = _get_dunder_annotations(obj)
File "C:\Users\varun\AppData\Local\Programs\Python\Python314\Lib\annotationlib.py", line 847, in _get_dunder_annotations
ann = getattr(obj, "__annotations__", None)
File "<python-input-9>", line 1, in __annotate__
def func(arg: Undefined):
^^^^^^^^^
NameError: name 'Undefined' is not defined
>>> get_annotations(func, format=Format.FORWARDREF)
{'arg': ForwardRef('Undefined')}
>>> get_annotations(func, format=Format.STRING)
{'arg': 'Undefined'}
3. map() 方法中的数组长度检查
在 Python 中,map()
函数类似于一个循环。它接受一个函数和一个可迭代对象(如列表或元组)作为输入。
对于可迭代对象中的每个元素,map()
应用给定的函数。这会创建一个新的可迭代对象,其中包含每次函数调用的结果。
本质上,map()
是一种方便的方法,可以将相同的操作应用于集合中的每个元素。
以前,你会这样编写 map()
功能:
>>> def mul(a, b):
... return a * b
...
>>> l1 = [1, 2, 3, 4]
>>> l2 = [5, 6, 7]
>>> result=list(map(mul,l1,l2))
[5, 12, 21]
在这里,l2
包含 3 个元素,而 l1
包含 4 个元素。在 Python 3.14 中使用 map()
函数时,可以通过设置 strict=True
标志来更好地处理这种情况:
>>> def mul(a, b):
... return a * b
...
>>> l1 = [1, 2, 3, 4]
>>> l2 = [5, 6, 7]
>>> result=list(map(mul,l1,l2, strict=True))
Traceback (most recent call last):
File "<python-input-33>", line 1, in <module>
result=list(map(mul,l1,l2, strict=True))
ValueError: map() argument 2 is shorter than argument 1
4. 解包值 —— 改进的错误消息
对于 Python 开发者来说,当编写代码并遇到错误时,错误消息有助于你找出代码中的问题。
与早期 Python 版本相比,改进的错误消息使你的生活变得更加轻松。
例如,考虑以下代码,解包失败:
>>> item1, item2, item3 = 1, 2, 3, 4
Traceback (most recent call last):
File "<python-input-0>", line 1, in <module>
item1, item2, item3 = 1, 2, 3, 4
^^^^^^^^^^^^^^^^^^^
ValueError: too many values to unpack (expected 3, got 4)
现在,你会得到一个更具描述性的错误消息 —— ValueError: too many values to unpack (expected 3, got 4)
在过去的几次 Python 发布中,错误消息有了很多改进,你可以在这篇文章中阅读相关内容。
5. 两个新的运算符方法
Python 3.14 带来了两个新的运算符方法:
operator.is_none(obj)
等同于 obj is None
,operator.is_not_none(obj)
等同于 obj is not None
。
本文由mdnice多平台发布