Python 3.9 新特性全面总结

Python 3.9 新特性全面总结

发布时间:2020 年 10 月 5 日

官方文档:https://docs.python.org/zh-cn/3.9/whatsnew/3.9.html


一、重磅新语法

1. 字典合并运算符 ||=(PEP 584)

终于不用再写 {**d1, **d2} 了!

python 复制代码
x = {"a": 1, "b": 2}
y = {"b": 99, "c": 3}

# 合并(新建字典,右侧优先)
z = x | y   # {'a': 1, 'b': 99, 'c': 3}

# 原地更新(类似 dict.update)
x |= y      # x 变为 {'a': 1, 'b': 99, 'c': 3}

注意:| 不修改原字典,|= 会修改左侧字典。


2. 内置类型直接用于类型标注(PEP 585)

以前写类型提示必须从 typing 导入 ListDict 等大写版本,现在可以直接用内置类型:

python 复制代码
# 旧写法(3.8 及以前)
from typing import List, Dict, Tuple
def foo(names: List[str]) -> Dict[str, int]: ...

# 新写法(3.9+)
def foo(names: list[str]) -> dict[str, int]: ...

支持的类型包括:listdicttuplesetfrozenset,以及 queue.Queue 等标准库类型。


3. 字符串新增 removeprefix / removesuffix(PEP 616)

告别 lstrip 的误用,精准移除前缀/后缀:

python 复制代码
"Hello, World!".removeprefix("Hello, ")   # 'World!'
"Hello, World!".removesuffix(", World!")  # 'Hello'

# 如果前/后缀不存在,原样返回
"Python".removeprefix("Java")  # 'Python'

bytesbytearraycollections.UserString 同样支持。


4. 装饰器语法放宽(PEP 614)

之前装饰器只能是简单的名称或属性访问,现在任意合法表达式都可以作为装饰器:

python 复制代码
# 现在合法了
button_list[0].clicked.connect
@button_list[0].clicked.connect
def slot(): ...

二、新增模块

1. zoneinfo --- 时区支持(PEP 615)

标准库终于内置了 IANA 时区数据库支持,不再需要第三方 pytz

python 复制代码
from zoneinfo import ZoneInfo
from datetime import datetime

dt = datetime(2024, 6, 1, 12, tzinfo=ZoneInfo("Asia/Shanghai"))
print(dt)  # 2024-06-01 12:00:00+08:00

在没有系统时区数据的平台(如 Windows),可通过 pip install tzdata 安装数据包。


2. graphlib --- 拓扑排序

新增 graphlib.TopologicalSorter,用于有向无环图的拓扑排序,适合任务依赖调度等场景:

python 复制代码
from graphlib import TopologicalSorter

graph = {"D": {"B", "C"}, "C": {"A"}, "B": {"A"}}
ts = TopologicalSorter(graph)
print(list(ts.static_order()))  # ['A', 'C', 'B', 'D'] 或类似顺序

三、标准库改进(常用部分)

math 模块增强

python 复制代码
import math

math.gcd(12, 18, 24)      # 支持多个参数了,返回 6
math.lcm(4, 6, 10)        # 新增!最小公倍数,返回 60
math.nextafter(1.0, 2.0)  # 新增!返回 1.0 往 2.0 方向的下一个浮点数
math.ulp(1.0)             # 新增!返回浮点数的最小精度单位

asyncio 改进

  • 新增 asyncio.to_thread():将同步阻塞函数放到线程池执行,避免阻塞事件循环:
python 复制代码
import asyncio

def blocking_io():
    # 模拟耗时 IO
    ...

async def main():
    await asyncio.to_thread(blocking_io)
  • asyncio.wait_for() 超时取消行为更可靠
  • 移除了 asyncio.Task.current_task()asyncio.Task.all_tasks()(已在 3.7 弃用),请用 asyncio.current_task()asyncio.all_tasks()

typing 模块

新增 typing.Annotated,可以为类型附加额外元数据(如校验规则、文档说明等):

python 复制代码
from typing import Annotated

# 附加元数据,不影响运行时类型检查,供框架(如 FastAPI)使用
Positive = Annotated[int, "must be positive"]

random 模块

新增 random.randbytes(n):生成 n 个随机字节:

python 复制代码
import random
random.randbytes(8)  # b'\x9f\x12...'

pathlib 模块

新增 Path.readlink(),读取符号链接目标路径(等价于 os.readlink())。

concurrent.futures 改进

Executor.shutdown() 新增 cancel_futures=True 参数,可立即取消所有未开始的任务,不必等待它们完成。

ipaddress 模块

  • 支持 IPv6 作用域地址(%scope_id 格式)
  • 注意(3.9.5+) :不再接受 IPv4 地址中带前缀零的写法(如 010.0.0.1),避免八进制歧义

四、解释器与性能优化

新 PEG 解析器(PEP 617)

CPython 从 LL(1) 解析器切换到基于 PEG 的新解析器,性能相当,但为未来新语法特性提供更大灵活性。Python 3.10 起旧解析器被彻底移除。

内置类型 vectorcall 加速

rangetuplesetfrozensetlistdict 等内置类型通过 PEP 590 vectorcall 协议加速,函数调用开销更低。

其他优化

  • 多线程信号处理优化:非主线程不再每条字节码都检查信号,减少不必要的中断
  • UTF-8 / ASCII 短字符串解码速度提升约 15%
  • ProcessPoolExecutor 工作进程按需创建,减少空闲进程的 CPU 浪费
  • 垃圾回收不再因复活对象而阻塞其他不可达对象的回收

五、弃用警告(需要注意)

弃用内容 说明 替代方案
collections.Mapping 等别名 Python 3.9 是最后支持版本,3.10 移除 改用 collections.abc.Mapping
parsersymbol 模块 随旧解析器一起弃用 改用 ast 模块
math.factorial(float) 不再接受浮点数参数 传入整数
asyncio.wait() 传入协程对象 将在 3.11 移除 改传 Task 或 Future
random.shuffle(x, random=...) random 参数弃用 直接调用 random.shuffle(x)
lib2to3 模块 发出 PendingDeprecationWarning 考虑 LibCST 或 parso
GzipFile 写入不指定 mode 未来默认改为读取 显式传入 mode='wb'

六、正式移除(升级必看)

这些 API 在 3.9 中已彻底删除,升级时需检查代码:

移除内容 替代方案
array.tostring() / fromstring() tobytes() / frombytes()
threading.Thread.isAlive() is_alive()
base64.encodestring() / decodestring() encodebytes() / decodebytes()
fractions.gcd() math.gcd()
json.loads(encoding=...) 直接传字符串,无需指定编码
asyncio.Task.current_task() / all_tasks() asyncio.current_task() / asyncio.all_tasks()
ElementTree.getchildren() / getiterator() list(x) / x.iter()
sys.getcheckinterval() / setcheckinterval() sys.getswitchinterval() / setswitchinterval()
_dummy_thread / dummy_threading 模块 已无替代,直接移除
with (await asyncio.lock): 语法 async with lock:

七、其他值得关注的小变化

  • __main__.__file__ 改为绝对路径python3 script.py__file__ 不再是相对路径,os.chdir() 后仍然有效
  • sys.stderr 改为行缓冲:非交互模式下 stderr 不再是块缓冲,日志输出更及时
  • datetime.isocalendar() 返回 namedtuple :可以用 .year.week.weekday 访问字段
  • logging.getLogger('root') 行为变化 :现在返回真正的根日志器,而非名为 root 的普通日志器
  • Unicode 数据库升级到 13.0

总结

Python 3.9 的核心亮点:

  1. | 字典合并运算符 --- 最受欢迎的语法糖之一
  2. 内置类型直接用于类型标注 --- 告别 from typing import List
  3. str.removeprefix/removesuffix --- 简洁实用
  4. zoneinfo 时区模块 --- 标准库终于有了靠谱的时区支持
  5. PEG 解析器 --- 为未来语法扩展铺路

同时这也是 Python 2 兼容层的最后一个版本collections.Mapping 等别名将在 3.10 彻底消失,建议尽早迁移。


参考:Python 3.9 官方文档 - What's New

内容由 AI 整理生成,内容仅供参考,请仔细甄别。

相关推荐
草莓熊Lotso6 分钟前
【LangChain】核心组件详解:文档加载器(Document Loaders)
开发语言·c++·python·langchain·软件工程
开开心心就好16 分钟前
Word双击预览图片插件弥补Word功能缺失
人工智能·python·智能手机·ocr·电脑·word·音视频
qq_263_tohua34 分钟前
第113期 20260725 最近在阅读叶沅鑫老师的多模态配准书籍,发现有不少错误,让人读了头脑发大。
python
可触的未来,发芽的智生42 分钟前
发现-元认知技能,激起神经符号系统跃变
javascript·人工智能·python·程序人生·自然语言处理
第二个人42 分钟前
Python Web开发:从Flask到FastAPI,我经历了什么
前端·python·flask
蓝创工坊Blue Foundry2 小时前
扫描件批量转 Excel:先确认要整表还原还是字段汇总
python·pdf·ocr·excel
二十雨辰2 小时前
[爬虫]-解析
开发语言·python
天天爱吃肉82183 小时前
AI Agent时代你的经验值多少钱?
人工智能·python·功能测试·学习·汽车
鱼香鱼香rose3 小时前
java-2
java·开发语言·python