Python 3.12 新特性:你必须知道的6个改进


Python 3.12 值得升级吗?

一句话:值得。3.12 是近几年变化最大的版本之一。

# 检查版本
python --version

# 用 pyenv 安装
pyenv install 3.12.0
pyenv global 3.12.0

1. f-string 全面升级

以前 f-string 里不能用同种引号,不能跨行,不能嵌套表达式。3.12 全解禁:

# ✅ 3.12 — 现在可以在 f-string 里用同种引号
name = "Python"
print(f"Hello, {"world".upper()}!")  # Hello, WORLD!

# ✅ f-string 嵌套,以前只能用 \
data = {"key": "value"}
print(f"Result: {data["key"]}")  # Result: value

# ✅ 多行 f-string 表达式
result = f"""
Numbers: {
    ", ".join(str(i) for i in range(5))
}
"""

2. type 语句 — 类型别名

# 旧写法(3.11及以前)
from typing import TypeAlias
Vector = list[float]  # 不够明确

# 新写法(3.12)
type Vector = list[float]
type Matrix = list[Vector]
type Callback[T] = Callable[[T], None]  # 支持泛型!

# 使用
def dot_product(a: Vector, b: Vector) -> float:
    return sum(x * y for x, y in zip(a, b))

3. 泛型语法简化

# 旧写法
from typing import TypeVar, Generic
T = TypeVar('T')

class Stack(Generic[T]):
    def push(self, item: T) -> None: ...
    def pop(self) -> T: ...

# 新写法(3.12)— 简洁多了!
class Stack[T]:
    def __init__(self) -> None:
        self._items: list[T] = []
    
    def push(self, item: T) -> None:
        self._items.append(item)
    
    def pop(self) -> T:
        return self._items.pop()

# 泛型函数也一样
def first[T](lst: list[T]) -> T:
    return lst[0]

4. 更清晰的错误信息

# 3.11 之前
>>> import collections.abc
>>> collections.abc.Mapping[str, int][str, int]
TypeError: ...

# 3.12 — 精准指出问题
class Point:
    x: int
    y: int

p = Point()
print(p.z)
# AttributeError: 'Point' object has no attribute 'z'
# Did you mean: 'x' or 'y'?  ← 3.12 会给建议!

5. 性能提升

基准测试3.11 vs 3.103.12 vs 3.11
综合速度+25%+5%
内存使用基线-10%
启动时间基线更快

3.12 重点优化了子解释器(支持真正的多线程,实验性),未来潜力巨大。


6. @override 装饰器

from typing import override

class Animal:
    def speak(self) -> str:
        return "..."

class Dog(Animal):
    @override  # 告诉类型检查器:这是有意重写父类方法
    def speak(self) -> str:
        return "Woof!"
    
    @override
    def fly(self) -> None:  # ❌ 类型检查器会报错!Animal 没有 fly 方法
        pass

知识卡片 📌

Python 3.12 六大亮点:

1. f-string  →  支持同种引号、嵌套、多行表达式
2. type 语句  →  清晰的类型别名定义
3. 泛型语法   →  class Foo[T] 代替 Generic[T]
4. 错误提示   →  更人性化,甚至会给出建议
5. 性能       →  内存降低,速度微升
6. @override  →  方法重写安全检查

升级命令:
  pyenv install 3.12.x
  poetry env use 3.12

现在还在用 3.10?可以升了,3.12 向后兼容性很好。