最新的 Python 特性

最新的 Python 特性

本文将介绍 Python 的最新特性。

我们将从实际应用角度,逐步讲解 Python 3.12 到 3.13 代中值得关注的“即刻可用”新特性。

YouTube Video

最新的 Python 特性

近年来,Python 的发展不仅关注**“易于编写”,同时也强调“健壮性、速度和可读性”**。下面,我们将介绍从 Python 3.12 到 3.13 代中的值得关注的新特性。

错误信息的显著改进(Python 3.12)

在 Python 3.12 中,错误信息显示得更加具体和直观。你可以立即发现错误发生的位置,显著减少调试时间。

1def calc_total(price, tax):
2    return price + price * tax
3
4result = calc_total(100, )
  • 缺失的参数会显示相关的行和位置,这样找到原因时不会感到困惑。

“match”语句的实际应用(结构化模式匹配)

“match”语句允许你以声明式的方式描述复杂的条件分支和数据结构判断。处理字典和嵌套结构时,代码的可读性特别强。

1user = {"status": "active", "name": "Alice"}
2
3match user:
4    case {"status": "active", "name": name}:
5        print(f"Welcome back, {name}!")
6    case {"status": "inactive"}:
7        print("Please activate your account.")
8    case _:
9        print("Unknown user status.")
  • 由于可以同时进行条件分支和数据提取,所以无需嵌套 if 语句。

用于处理嵌套数据的直观模式匹配

“match”语句对于 JSON 或 API 响应等结构化数据也非常有效。

1data = {"user": {"name": "Bob", "age": 25}}
2
3match data:
4    case {"user": {"name": name, "age": age}}:
5        print(f"{name} is {age} years old.")
  • 你可以安全地提取所需的元素,减少防御性代码的编写。

增强的 f-string 调试输出(=` 语法 / Python 3.8 及以后,提高易用性)

通过 f-string,你可以添加 =,同时显示表达式本身和其求值结果。此功能专为调试而设计,当你需要快速检查变量内容时非常有用。

1x = 10
2y = 20
3print(f"{x=}, {y=}, {x+y=}")
  • 变量名和值一起显示,让临时用 print() 调试输出更易于阅读。
  • 可以更简洁、更有表现力地书写日志输出和验证代码。

简化的类型提示和 'type' 别名(Python 3.12:新类型别名语法)

在 Python 3.12 中,引入了用于定义类型别名的专用语法——type 语句。这使得类型提示不仅仅作为补充信息,还能作为清晰表达设计意图的语言要素

1type UserId = int
2type UserName = str
3
4def greet(user_id: UserId, name: UserName) -> str:
5    return f"Hello, {name} (id={user_id})"
  • 通过为 UserIdUserName 赋予意义,即使二者都用 intstr 类型,也可以明确区分不同角色
  • 类型定义更加简洁,降低了代码审查和维护时的理解成本。
  • 以往像 UserId = int 这样通过赋值创建类型别名,而用 type 语句则明确指出“这是类型定义”。这对于中大型代码库中提升设计可读性尤其有效。

使用内置类型的自然类型注解(Python 3.9+ 简化泛型)

自 Python 3.9 起,你可以直接将 listdict 等内置类型用作泛型

这样可以无需从 typing 模块导入类型,编写更直观、可读的类型提示。

1def sum_numbers(numbers: list[int]) -> int:
2    return sum(numbers)
3
4print(sum_numbers([1, 2, 3, 4]))
  • 类型提示不作为“约束”,而是用作“说明处理内容的文档”。

通过 Self 类型实现安全的方法链(Python 3.11 及以后)

自 Python 3.11 起,你可以将 Self 指定为返回自身类实例的方法的返回类型。

这样你可以安全地编写方法链,而不会丢失类型信息。

 1from typing import Self
 2
 3class Counter:
 4    def __init__(self, value: int = 0) -> None:
 5        self.value = value
 6
 7    def increment(self) -> Self:
 8        self.value += 1
 9        return self
10
11counter = Counter()
12counter.increment().increment()
13print(counter.value)
  • 即使是返回 self 的方法,也能保留正确的返回类型
  • IDE 和类型检查器能够准确理解方法链。

更清晰的字符串处理(removeprefix / removesuffix | Python 3.9 及以后)

自 Python 3.9 起,新增了 str.removeprefix()str.removesuffix() 方法,可以安全地去除字符串的前缀和后缀。使用这些方法可以准确地在代码中表达“只去除开头或结尾”的意图。

1filename = "report_2026.txt"
2
3clean_name = filename.removeprefix("report_")
4name_without_ext = clean_name.removesuffix(".txt")
5
6print(name_without_ext)
  • 只有在指定字符串正好在开头或结尾时才会被移除,避免了意外的替换。
  • 这种方式相比 replace() 或切片,具有更好的可读性和安全性。
  • 尤其在处理“有特定格式的字符串”(如文件名、URL 预处理)时,用这些方法能极大降低出错风险

国际化中的强大字符串比较(str.casefold() | Unicode 支持)

Python 的 str.casefold() 是一种支持 Unicode 的大小写不敏感比较方法。它与简单的 lower()upper() 不同,能够对字符串进行归一化,包括针对语言的特殊字符转换。

1text1 = "Stra\u00dfe"
2text2 = "strasse"
3
4print(text1)
5print(text2)
6
7print(f"Comparison Result: {text1.casefold() == text2.casefold()}")
  • 比如德语的 ßss 这样的因语言差异而产生的不同,它都能正确处理。
  • 这是多语言支持或国际化应用中必不可少的技术。

标准 TOML 支持(tomllib | Python 3.11 及以后)

自 Python 3.11 起,标准库新增了用于读取 TOML 配置文件的 tomllib 模块。配置管理现在可以完全在 Python 内完成,无需依赖外部库。

 1import tomllib
 2
 3with open("config.toml", "rb") as f:
 4    config = tomllib.load(f)
 5
 6print(config["database"]["host"])
 7
 8# config.toml
 9# title = "TOML Example"
10# [database]
11# host = "192.168.1.1"
12# ports = [ 8001, 8001, 8002 ]
  • 不再需要像 toml 这样的外部包,简化了依赖关系。
  • 配置文件加载被标准化,使得分发、运维、CI 环境更容易管理。

并行处理时代的异常处理(ExceptionGroup / except* | Python 3.11 及以后)

Python 3.11 引入了 ExceptionGroup 用于同时处理多个异常,以及 except* 语法,能安全地在分支中处理它们。这是为处理异步或并行处理中“同时出现的错误”而新增的功能。

 1def process(values):
 2    errors = []
 3    for v in values:
 4        if v < 0:
 5            errors.append(ValueError(f"Negative value: {v}"))
 6    if errors:
 7        raise ExceptionGroup("Invalid values", errors)
 8
 9try:
10    process([1, -2, -3])
11except* ValueError as e:
12    print("Handled:", e)
  • 多个异常现可在一次操作中抛出并分类处理
  • 它解决了异步处理中只能看到第一个错误的问题。
  • asyncio.gather() 或并行批量处理等操作中,可能会同时出现多个失败原因。通过 ExceptionGroup,可以更方便地进行错误收集、日志记录和重试策略

只需升级到最新版即可提升性能

自 Python 3.11 起,许多流程通过内部优化大大加快了速度。

1def count_up(n):
2    total = 0
3    for i in range(n):
4        total += i
5    return total
6
7print(count_up(1_000_000))
  • 其重大优点是无需重写代码也能获得性能提升。

垃圾回收的控制(通过 gc 模块进行显式管理)

在 Python 中,利用标准库的 gc 模块,可以临时禁用或手动执行垃圾回收。对于批量处理大数据集或对性能要求极高的场景,这是非常有效的优化手段。

1import gc
2
3gc.disable()
4# heavy batch processing
5gc.enable()
6gc.collect()
  • 抑制不必要的垃圾回收,可以减少处理时间的波动
  • 可以在处理间隔时显式进行回收,使内存使用更易追踪。
  • 不过,这种方法不应作为默认优化手段,只有在性能分析发现 GC 是瓶颈时才需考虑。对于大多数应用,依赖 Python 的自动垃圾回收机制是最安全的。

总结

随着 Python 3.12 到 3.13 这一代的错误信息改进与类型提示进化,代码的理解与维护比以往任何时候都更容易。此外,更好的调试体验和内部优化带来的性能提升,正持续直接提升实际生产力。你不必一次性使用所有新特性;实际开发中建议先用最新版 Python,再按需逐步引入新功能。这种渐进式采用会让 Python 代码更易读、更健壮。

您可以在我们的YouTube频道上使用Visual Studio Code跟随上述文章进行学习。 请也查看我们的YouTube频道。

YouTube Video