Python 3.14 中的最佳新功能和修正

模板字符串、延迟注释、更好的错误信息和新的调试器界面,这些都是 Python 3.14 中的好东西。现在是测试版。

Python 3.14 的首个测试版现已发布。本文概述了 Python 下一版本中最重要的新特性,以及这些特性对 Python 开发人员的意义。

Python 3.14 中的主要新特性

这些是 Python 3.14 中最重要的新特性:

  • 模板字符串
  • 注释的延迟评估
  • 更好的错误信息
  • CPython 的安全外部调试器接口
  • 用于 Python 运行时配置的 C API
  • “尾调用编译(Tail-call-compiled) “解释器

模板字符串

元素周期表长期以来,我们一直在 Python 中使用 f-strings 来方便地格式化字符串中的变量。Python 3.14 在这方面引入了更高级的功能,即 PEP 750 中定义的模板字符串。

模板字符串,或 t-字符串,可以让您将模板与对模板结构而不仅仅是输出进行操作的函数结合起来。你可以编写一个模板处理程序,允许在输出时操作模板中的所有变量,或只操作特定类型的变量,或只操作与某些输出相匹配的变量。你也可以将变量和插值文本作为不同类型的独立对象来处理。

例如,如果您有一个模板t"My name is {user_name}, and I'm from {user_locale}",您可以让变量 user_name user_locale 在显示前自动清除任何 HTML 内容。您还可以对输出中的 “My name is ”和 “and I'm from ”部分自动执行转换,因为这些部分将被标记为特殊类型的Interpolation

模板字符串将使编写模板引擎(如 Jinja2)或直接在 Python 中复制这些模板引擎的大部分功能变得更容易,而无需第三方库的开销。

注解的延迟评估

Python 中的类型注解历来是 “急于 ”评估的,即在代码中首次遇到时评估。这使得我们很难对一个类型进行前向引用–例如,让一个类方法在接受参数时提示另一个在模块中还未定义的类型:

class Thing:
    def frob(self, other:OtherThing):
        ...
class OtherThing:
    ...

类似这样的代码通常无法通过校验。解决方法是

class Thing:
    def frob(self, other:"OtherThing"):
        ...
class OtherThing:
    ...

或者可以使用 from __future__ import annotations

在 Python 3.14 中,对象的注解现在存储在 “注解函数 ”中,可以通过 __annotate__ 属性获得。当需要时,该属性会返回给定对象的注解,因此注解可以由衬砌器懒散地评估,甚至在运行时评估。

annotationlib 模块提供了在运行时检查这些新注释的工具,或作为内核过程的一部分。

如果您目前使用 from __future__ import annotations 作为处理延迟注释的变通方法,您现在不需要做任何更改,尽管该指令已被弃用,并将在未来的 Python 版本中完全删除(很可能在 2029 年之后的某个时候)。

更好的错误信息

在过去的几个 Python 版本中,错误信息在很多方面都得到了改进和完善。Python 3.14 延续了这一传统。

最大的改进是 现在,与 Python 关键字密切匹配的未知词会给出建议。例如

forr a in b:
^^^^
SyntaxError: invalid syntax. Did you mean 'for'?

还对许多其他错误进行了改进:

  • 在解包问题中,如果预期条目数和收到的条目数不匹配,现在在更多情况下会出现比以前更详细的错误。
  • 放错位置的 elif 块会产生自己的特定错误信息。
  • 非法结合三元赋值和控制流的语句(如 x = a if b else pass)现在会产生详细的错误信息。
  • 闭合不正确的字符串会产生补全字符串的建议。

CPython 的安全外部调试器接口

将外部调试器附加到 CPython 解释器的代价是大量的运行时开销和潜在的安全问题。此外,您无法自发地将调试器附加到 CPython。为了使用外部调试器,您必须在启动 CPython 时附加调试器。

在 Python 3.14 中,一个新的调试器接口为 CPython 解释器提供了钩子,以便在不改变其执行的情况下附加调试器。您可以使用 Python 的 pdb
调试模块附加到另一个 Python 进程(通过其进程 ID),并在目标进程上执行交互式调试,而无需重启附加了调试器的进程。

除了带来更多便利外,新调试器接口还能让第三方更轻松地编写更好、更强大的调试工具。他们将不再需要在解释器中注入自己的自定义代码,因为这种代码可能很脆并会产生新的错误。

用于 Python 运行时配置的 C API

Python 配置 C API 提供了一个 C API,让用户使用 Python 对象而不是 C 结构来设置或获取有关 Python 解释器当前配置的信息。这样,解释器就可以直接从 Python 本身进行配置,从而更容易编写 Python 级工具,在运行时更改解释器的行为。

Python 配置 C API 是对 CPython 内部和 API(包括如何初始化 CPython 的 API)进行全面清理的一部分。请注意,如果 C 语言用户需要,他们可以随时返回到低级 API。

为多个异常使用 `except` 的更简便方法

如果想在 try/except 代码块中捕获多个异常,就必须使用括号将它们分组:

try:
    flaky_function()
except (BigProblem, SmallProblem):
    ...

在 Python 3.14 中,您可以简单地列出用逗号分隔的多个异常:

try:
    flaky_function()
except BigProblem, SmallProblem:
    ...

当然,原来的语法仍然有效,但新语法意味着在常见的情况下可以减少一些键入。

尾调用编译(Tail-call-compiled)解释器

Python 3.14 中的 CPython 解释器可以使用 C 代码中的一个特性,即在函数之间使用尾调用。当使用支持这些特性的 C 编译器编译时,CPython 的运行速度会稍快一些。请注意,该特性与在 Python 语言中启用尾调用优化不是一回事;它是 CPython 解释器的内部优化。除了升级到 Python 3.14 之外,Python 开发人员不需要做任何事情就能从中受益。

遗憾的是,由于 Clang/LLVM19 中的一个编译器错误(已在后续版本中修复),最初估计的这一更改的性能改进结果偏差很大。性能提升幅度在 3% 到 5% 之间,远低于最初报告的 9% 到 15% 的速度提升。与任何类似的优化一样,你需要运行自己的基准测试,看看你的应用程序性能如何。

你也许感兴趣的:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注