Python 3.8 新特性全面总结
·
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 配置接口:
PyConfig、PyPreConfig、PyStatusPy_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_lineno、end_col_offset csv.DictReader返回dict(替代OrderedDict)namedtuple._asdict()返回dict(替代OrderedDict)cProfile.Profile支持上下文管理器gc.get_objects()支持指定代gzip.compress(mtime=...)可复现输出logging.basicConfig(force=...)强制重配ast.parse()新增type_comments、mode='func_type'ast.get_source_segment()获取节点源码片段
IDLE 改进
- 输出超过 50 行自动折叠为按钮
- 可选行号显示
- 支持 emoji 等非 BMP 字符
- 模块运行自定义参数
总结
Python 3.8 的核心亮点:
- 赋值表达式
:=— 海象运算符,减少重复计算 - 位置参数标记
/— 纯 Python 模拟 C 函数行为 - f-string
=调试 — 自文档化表达式 - 审计钩子(PEP 578) — 运行时安全监控
importlib.metadata— 读取第三方包元数据functools.cached_property+@singledispatchmethodmath模块大幅扩充 — dist、prod、perm、comb、isqrtmultiprocessing.shared_memory— 高效进程间通信- 字节码并行缓存 — 独立
__pycache__路径 - Debug/Release ABI 兼容 — C 扩展开发更便利
Python 3.8 是一个语法糖与底层改进并存的版本。海象运算符改变了惯用写法,位置参数标记解决了长期痛点,审计钩子为安全敏感应用提供了基础设施,cached_property 和 singledispatchmethod 极大丰富了函数式编程工具箱。
参考:Python 3.8 官方文档 - What’s New
内容由 AI 整理生成,内容仅供参考,请仔细甄别。
更多推荐


所有评论(0)