就在几个月前,我们看到了 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.environos.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 模块提供了检查延迟注解的工具。

注解可以按照以下三种格式进行评估:

  1. VALUE — 评估注解为运行时值,类似于早期 Python 版本中的行为
  2. FORWARDREF — 此格式用特殊标记替换未定义的名称
  3. 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 带来了两个新的运算符方法:

  1. operator.is_none()
  2. operator.is_not_none()

operator.is_none(obj) 等同于 obj is Noneoperator.is_not_none(obj) 等同于 obj is not None

本文由mdnice多平台发布


Miniwa
29 声望1 粉丝