Python 3.8 新特性全面总结

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


一、重磅新语法

1. 赋值表达式 :=(海象运算符,PEP 572)

在表达式内部赋值,减少重复计算:

# 避免 len() 调用两次
if (n := len(a)) > 10:
    print(f"List is too long ({n} elements)")

# 正则匹配两次使用
if (mo := re.search(r'(\d+)% discount', ad)):
    discount = float(mo.group(1)) / 100

# while 循环同时测试和使用
while (block := f.read(256)) != '':
    process(block)

# 列表推导式中先过滤再使用
[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]

2. 位置参数标记 /(PEP 570)

左侧参数必须位置传递,右侧可关键字传递:

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

f(10, 20, 30, d=40, e=50, f=60)   # ✓
f(10, b=20, c=30, d=40, e=50, f=60)  # ✗ b 不能作为关键字
f(10, 20, 30, 40, 50, f=60)       # ✗ e 必须为关键字

# 内置函数示例
def len(obj, /):  # 阻止 len(obj='hello')
    ...

3. f-string = 自文档化调试(PEP 701)

>>> user = 'eric_idle'
>>> member_since = date(1975, 7, 31)
>>> f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"

>>> delta = date.today() - member_since
>>> f'{user=!s} {delta.days=:,d}'
'user=eric_idle delta.days=16,075'

>>> f'{theta=} {cos(radians(theta))=:.3f}'
theta=30 cos(radians(theta))=0.866

二、解释器与构建改进

1. 字节码并行文件系统缓存

# 配置字节码缓存路径(默认 __pycache__)
PYTHONPYCACHEPREFIX=/tmp/pycache python app.py
# sys.pycache_prefix 可查看当前路径

2. Debug 构建与 Release 使用相同 ABI

  • Debug 和 Release 构建现在 ABI 兼容
  • Debug 构建可加载 Release 模式的 C 扩展
  • C 扩展不再链接 libpython(Unix)
  • 新增 --embed 选项给 python3-config

3. Python 运行时审计钩子(PEP 578)

import sys

# 审计钩子:任何敏感操作触发回调
sys.addaudithook(lambda event, args: print(f"Event: {event}"))

import subprocess
# 现在会触发 audit 事件
subprocess.run("ls")

4. Python 初始化配置 C API(PEP 587)

新增 C API 配置接口:

  • PyConfigPyPreConfigPyStatus
  • Py_InitializeFromConfig()
  • 更精细的初始化控制

5. Vectorcall 快速调用协议(PEP 590)

C 扩展的优化调用协议,3.9 成为正式 API。


三、Pickle 协议 5:带外数据缓冲(PEP 574)

import pickle

# 大数据通过共享内存传输,减少内存拷贝
buffers = []
data = pickle.loads(payload, buffers=buffers)  # 接收带外缓冲

四、标准库新增模块

importlib.metadata(正式引入)

读取第三方包元数据:

from importlib.metadata import version, requires, files

version('requests')        # '2.22.0'
list(requires('requests'))  # 依赖列表
list(files('requests'))[:5]  # 包文件列表

五、标准库重要改进

1. asyncio.run() 稳定化

正式稳定(3.7 是临时 API)

import asyncio

async def main():
    return await asyncio.sleep(10, result='hello')

asyncio.run(main())  # 替代手动管理事件循环

异步 REPL:

python -m asyncio
>>> await asyncio.sleep(1, result='hello')

2. functools 三件套

# @cached_property:实例级缓存计算属性
import functools

class Dataset:
    @functools.cached_property
    def variance(self):
        return statistics.variance(self.data)

# @singledispatchmethod:方法级单分派
from functools import singledispatchmethod

class TaskManager:
    @singledispatchmethod
    def discard(self, value): ...

    @discard.register(list)
    def _(self, tasks): ...

# @lru_cache 可直接作为装饰器
@lru_cache
def f(x): ...

3. math 模块大幅增强

import math

math.dist([1, 0], [0, 1])       # 欧氏距离(2D-ND)
math.hypot(3, 4)                # 支持多维(之前只支持2D)
math.prod([1, 2, 3], start=10)  # 累乘:10*1*2*3=60
math.perm(10, 3)                # 排列:10P3=720
math.comb(10, 3)                # 组合:10C3=120
math.isqrt(1000000)             # 精确整数平方根:1000

4. itertools.accumulate 增强

from itertools import accumulate

list(accumulate([10, 5, 30, 15], initial=1000))
# [1000, 1010, 1015, 1045, 1060]

5. multiprocessing.shared_memory

进程间高效共享内存:

import multiprocessing.shared_memory as smm

# 创建共享内存块
shm = smm.SharedMemory(name='my_shm', create=True, size=1024)
shm.buf[:4] = b'\x01\x02\x03\x04'

6. datetime 逆运算

# fromisocalendar:ISO 日期反算
from datetime import date, datetime

date.fromisocalendar(2019, 1, 1)   # 2019-01-01(周一)
datetime.fromisocalendar(2019, 52, 5)  # 2019-12-27

7. logging.basicConfig(force=True)

强制重置已有日志配置:

# 之前:首次调用后后续调用被忽略
# 现在:force=True 清除现有处理器
logging.basicConfig(level=logging.DEBUG, force=True)

8. os 模块改进

# Windows DLL 搜索路径
os.add_dll_directory(r"C:\path\to\dlls")

# 匿名内存文件(Linux)
fd = os.memfd_create("my_file")

9. pathlib.Path.link_to()

# 创建硬链接
p.link_to(target)  # p 指向 target

六、其他值得关注的变化

语言层面

  • continue 可用于 finally(之前非法)
  • 字典推导式:key 先于 value 求值
  • yield/return 解包不再需要括号
  • pow(a, -1, mod) 支持模逆运算
pow(38, -1, 137)  # 119,38 的模 137 逆元
  • Ctrl+C 退出码正确(Shell 可检测 SIGINT)
  • int/float/complex 优先使用 __index__
  • __reduce__ 返回值从 5 元组扩展到 6 元组

标准库

  • AST 节点新增 end_linenoend_col_offset
  • csv.DictReader 返回 dict(替代 OrderedDict
  • namedtuple._asdict() 返回 dict(替代 OrderedDict
  • cProfile.Profile 支持上下文管理器
  • gc.get_objects() 支持指定代
  • gzip.compress(mtime=...) 可复现输出
  • logging.basicConfig(force=...) 强制重配
  • ast.parse() 新增 type_commentsmode='func_type'
  • ast.get_source_segment() 获取节点源码片段

IDLE 改进

  • 输出超过 50 行自动折叠为按钮
  • 可选行号显示
  • 支持 emoji 等非 BMP 字符
  • 模块运行自定义参数

总结

Python 3.8 的核心亮点:

  1. 赋值表达式 := — 海象运算符,减少重复计算
  2. 位置参数标记 / — 纯 Python 模拟 C 函数行为
  3. f-string = 调试 — 自文档化表达式
  4. 审计钩子(PEP 578) — 运行时安全监控
  5. importlib.metadata — 读取第三方包元数据
  6. functools.cached_property + @singledispatchmethod
  7. math 模块大幅扩充 — dist、prod、perm、comb、isqrt
  8. multiprocessing.shared_memory — 高效进程间通信
  9. 字节码并行缓存 — 独立 __pycache__ 路径
  10. Debug/Release ABI 兼容 — C 扩展开发更便利

Python 3.8 是一个语法糖与底层改进并存的版本。海象运算符改变了惯用写法,位置参数标记解决了长期痛点,审计钩子为安全敏感应用提供了基础设施,cached_propertysingledispatchmethod 极大丰富了函数式编程工具箱。


参考:Python 3.8 官方文档 - What’s New
内容由 AI 整理生成,内容仅供参考,请仔细甄别。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐