Python 3.7 新特性全面总结
发布时间:2018 年 6 月 27 日
官方文档:https://docs.python.org/zh-cn/3.7/whatsnew/3.7.html
一、重磅新语法与新模块
1. 延迟求值注解(PEP 563)
from __future__ import annotations # 启用延迟求值
class C:
def from_string(cls, source: str) -> C: # 前向引用正常
...
def validate_b(self, obj: B) -> bool:
...
class B:
...
- 注解以字符串形式存储,避免启动时性能损耗
- 支持前向引用(无需引号包裹)
- 成为 3.10 默认行为
2. 数据类(PEP 557,dataclasses)
自动生成 __init__、__repr__、__eq__ 等方法的数据类:
from dataclasses import dataclass
@dataclass
class Point:
x: float
y: float
z: float = 0.0
name: str = ""
p = Point(1.5, 2.5)
print(p) # Point(x=1.5, y=2.5, z=0.0, name='')
p == Point(1.5, 2.5) # True(自动生成 __eq__)
hash(p) # 自动生成 __hash__
字段选项:
from dataclasses import field
@dataclass
class Config:
items: list = field(default_factory=list) # 可变默认值
active: bool = field(default=False)
metadata: dict = field(default_factory=dict)
3. 内置 breakpoint()(PEP 553)
替代 import pdb; pdb.set_trace():
# 一行代码进入调试器
breakpoint()
# 替换调试器(使用其他调试工具)
import pdb; sys.breakpointhook = pdb.pm
breakpoint() # 触发 pdb.pm
# 完全禁用
PYTHONBREAKPOINT=0 python app.py
4. 模块级 __getattr__(PEP 562)
模块属性访问钩子,用于废弃警告和延迟加载:
# mymodule.py
import warnings
def __getattr__(name):
if name == 'old_api':
warnings.warn("old_api 已废弃,使用 new_api", DeprecationWarning)
return new_api
raise AttributeError(f"module has no attribute '{name}'")
5. 上下文变量(PEP 567,contextvars)
与线程本地存储不同,上下文变量在异步代码中正确工作:
import contextvars
request_id = contextvars.ContextVar('request_id')
# 设置值
request_id.set('abc-123')
# 获取值
token = request_id.get() # 'abc-123'
# 重置(恢复之前的值)
request_id.set('xyz')
reset_token = request_id.set('new-id')
request_id.reset(reset_token)
print(request_id.get()) # 'xyz'
asyncio 和 decimal 模块已基于此重写。
二、运行时与环境改进
1. 强制 UTF-8 模式(PEP 540)
# 环境变量
PYTHONUTF8=1 python app.py
# 命令行选项
python -X utf8 app.py
# 自动触发条件:locale 为 C/POSIX 且 locale 强制失败
2. C Locale 强制转换(PEP 538)
自动将旧 C locale 转换到 UTF-8:
# 调试模式:显示警告
PYTHONCOERCECLOCALE=warn python app.py
3. 确定性 .pyc 文件(PEP 552)
# 生成基于哈希的 .pyc(替代时间戳)
python -m compileall --hash-based pycache/
# 运行时不生成基于哈希的 .pyc(默认仍用时间戳)
4. 开发模式
python -X dev app.py
# 或
PYTHONDEVMODE=1 python app.py
# 效果:
# - 警告视为错误(DeprecationWarning → 报错)
# - 资源泄漏警告
# - io.IOBase finalizer 异常记录到 stderr
三、性能与时间改进
纳秒级时间函数(PEP 564)
import time
time.time_ns() # 纳秒级时间戳(int)
time.monotonic_ns() # 单调时钟
time.perf_counter_ns() # 高精度性能计时
time.process_time_ns() # CPU 时间
# Linux/Windows 上精度提升约 3 倍
其他性能改进
| 改进 | 说明 |
|---|---|
| 字典插入顺序保证 | dict 实现细节升级为语言规范 |
| 通用类型操作 | __class_getitem__ 使泛型类型操作快 7 倍 |
| 导入时间改进 | 注解字符串化减少启动开销 |
| asyncio 重构 | 全部改用 async/await 语法 |
四、标准库新增模块
contextvars — 上下文变量
见上文第一节第 5 点。
dataclasses — 数据类
见上文第一节第 2 点。
importlib.resources — 资源访问
from importlib.resources import path, files
# 读取包内资源文件
with path('my_package.data', 'example.txt') as p:
content = p.read_text()
# Python 3.9+ 的新 API
from importlib.resources import files
(files('my_package.data') / 'example.txt').read_text()
五、标准库重要改进
1. asyncio 大幅增强
# asyncio.run():简化协程运行
asyncio.run(main())
# create_task():创建任务
task = asyncio.create_task(fetch_data())
# get_running_loop():获取当前运行中的循环
loop = asyncio.get_running_loop()
# current_task() / all_tasks():任务查询
current = asyncio.current_task()
all_tasks = asyncio.all_tasks()
# Server 异步上下文管理器
async with await loop.create_server(...) as srv:
...
# start_tls():TLS 升级
reader, writer = await loop.start_tls(...)
contextvars 集成: 异步任务自动跟踪上下文变量。
2. datetime.fromisoformat()
from datetime import datetime
dt = datetime.fromisoformat('2019-08-14T12:30:45')
# ←→ datetime.isoformat()
3. collections.namedtuple() 支持默认值
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'], defaults=[0, 0])
p = Point(5) # Point(x=5, y=0)
4. gc.freeze() / gc.unfreeze()
import gc
gc.freeze() # 冻结 GC,fork 前使用减少内存拷贝
gc.unfreeze() # 解冻
gc.get_freeze_count() # 冻结对象数量
5. hmac.digest() 一次性摘要
import hmac
# 一次性计算,比 HMAC().digest() 快 3 倍
digest = hmac.digest(key, msg, 'sha256')
6. contextlib 异步支持
from contextlib import nullcontext, asynccontextmanager
# 同步
with nullcontext(None): # 替代 ExitStack 的简单用法
...
# 异步
@asynccontextmanager
async def managed_resource():
yield resource
await resource.cleanup()
7. compileall 哈希失效模式
import compileall
compileall.compile_dir('mypackage', invalidation_mode=compileall.HASH_BASED)
六、其他值得关注的变化
语言层面
async/await成为保留关键字(3.6 起保留,3.7 起必须通过from __future__使用)- 函数参数上限提升:超过 255 个参数、255 个默认值均可
str.isascii():判断是否仅含 ASCII 字符"hello".isascii() # True "你好".isascii() # Falsebytes.fromhex()支持所有 ASCII 空白- f-string 中支持 async for/await(之前非法)
ImportError显示模块路径types.TracebackType可在 Python 中实例化-m启动时sys.path[0]立即展开
标准库
argparse支持混合选项和位置参数cProfile支持-m module_namehttp.server支持If-Modified-Since、目录参数、ThreadingHTTPServerdis()可反汇编嵌套代码对象(推导式、生成器)crypt支持 Blowfishenum支持_ignore_属性functools.singledispatch支持类型注解注册io.TextIOWrapper.reconfigure()重新配置文本流http.client新增blocksize参数
总结
Python 3.7 的核心亮点:
- 数据类(dataclasses) —
@dataclass自动生成__init__、__repr__、__eq__、__hash__ - 上下文变量(contextvars) — 异步安全的上下文隔离,asyncio/decimal 重写基础
breakpoint()— 一行代码进调试器- 延迟求值注解 —
from __future__ import annotations - 模块级
__getattr__— 模块属性访问钩子 - 纳秒级时间函数 —
time.time_ns()等精度提升 3 倍 - UTF-8 强制模式 —
-X utf8/PYTHONUTF8=1 - 确定性 .pyc — 基于哈希的缓存验证
dict插入顺序保证 — 实现细节升格为语言规范- 开发模式(
-X dev) — 严格运行时检查
Python 3.7 是一个异步基础设施与开发者体验双升级的版本。数据类和上下文变量的引入极大丰富了标准库的工具箱,而纳秒时间函数、开发模式、UTF-8 强制模式等改进则解决了长期困扰生产环境的实际问题。
参考:Python 3.7 官方文档 - What’s New
内容由 AI 整理生成,内容仅供参考,请仔细甄别。

314

被折叠的 条评论
为什么被折叠?



