Python 3.14 发布——你必须了解的五大特性

就在几个月前,我们看到了 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多平台发布

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • 说实话,我在官方文档查看了,但是我没看懂... Python 3.10 有什么新变化 新的语法特性: PEP 63...
    高桥my阅读 1,352评论 0 1
  • 善工必先利其器 介绍 标准库意味着由官方维护,会随着语言的演变而演变;因而值得大下功夫,好好琢磨。 标准库非常庞大...
    WrRanX阅读 1,328评论 0 1
  • 很多人在学习了基本的Python语言知识后,就转入应用阶段了,后期很少对语言本身的新变化、新内容进行跟踪学习和知识...
    liujiangblog阅读 1,123评论 0 4
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,217评论 4 16
  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 18,952评论 17 410