【Python】一起来看看Python 3.14 中的5大特性吧

Python 3.14 预发布版已经来了!这是 Python 社区计划的 7 个版本中的第 3 个 alpha 版本,我简直按捺不住激动的心情。

Python 在市场上已经存在相当长一段时间了,作为一名 Python 开发者,我非常兴奋地告诉大家,Python 正在通过每个新版本逐步进行重大更新。

就在几个月前,我们看到了 Python 3.13 发布时关于 可选 GIL 更改 的重大更新,而我还没从那个激动中缓过来。你可以在这里阅读更多关于 GIL 的更新 —— GIL 不复存在

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 代码的一部分,用于提供元数据并支持类型提示。注解提供了关于变量、函数参数和返回值的信息。

照片由 Kelly Sikkema 拍摄,来自 Unsplash

注解帮助程序员添加元数据,说明哪些变量可能期望什么类型的值。

例如 ——


>>> 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 中,可以通过使用 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 None,而 operator.is_not_none(obj) 等同于 obj is not None

希望你喜欢阅读这篇文章!

作者:codeory

物联沃分享整理
物联沃-IOTWORD物联网 » 【Python】一起来看看Python 3.14 中的5大特性吧

发表回复