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