Python 3.9 新特性全面总结
2026/7/5 15:27:43 网站建设 项目流程

Python 3.9 新特性全面总结

发布时间:2020 年 10 月 5 日
官方文档:https://docs.python.org/zh-cn/3.9/whatsnew/3.9.html


一、重磅新语法

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

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

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等大写版本,现在可以直接用内置类型:

# 旧写法(3.8 及以前)fromtypingimportList,Dict,Tupledeffoo(names:List[str])->Dict[str,int]:...# 新写法(3.9+)deffoo(names:list[str])->dict[str,int]:...

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


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

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

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

bytesbytearraycollections.UserString同样支持。


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

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

# 现在合法了button_list[0].clicked.connect@button_list[0].clicked.connectdefslot():...

二、新增模块

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

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

fromzoneinfoimportZoneInfofromdatetimeimportdatetime 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,用于有向无环图的拓扑排序,适合任务依赖调度等场景:

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

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

math模块增强

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

asyncio改进

  • 新增asyncio.to_thread():将同步阻塞函数放到线程池执行,避免阻塞事件循环:
importasynciodefblocking_io():# 模拟耗时 IO...asyncdefmain():awaitasyncio.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,可以为类型附加额外元数据(如校验规则、文档说明等):

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

random模块

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

importrandom 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 整理生成,内容仅供参考,请仔细甄别。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询