Python 3.7 新特性全面总结

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'

asynciodecimal 模块已基于此重写。


二、运行时与环境改进

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()    # False
    
  • bytes.fromhex() 支持所有 ASCII 空白
  • f-string 中支持 async for/await(之前非法)
  • ImportError 显示模块路径
  • types.TracebackType 可在 Python 中实例化
  • -m 启动时 sys.path[0] 立即展开

标准库

  • argparse 支持混合选项和位置参数
  • cProfile 支持 -m module_name
  • http.server 支持 If-Modified-Since、目录参数、ThreadingHTTPServer
  • dis() 可反汇编嵌套代码对象(推导式、生成器)
  • crypt 支持 Blowfish
  • enum 支持 _ignore_ 属性
  • functools.singledispatch 支持类型注解注册
  • io.TextIOWrapper.reconfigure() 重新配置文本流
  • http.client 新增 blocksize 参数

总结

Python 3.7 的核心亮点:

  1. 数据类(dataclasses)@dataclass 自动生成 __init____repr____eq____hash__
  2. 上下文变量(contextvars) — 异步安全的上下文隔离,asyncio/decimal 重写基础
  3. breakpoint() — 一行代码进调试器
  4. 延迟求值注解from __future__ import annotations
  5. 模块级 __getattr__ — 模块属性访问钩子
  6. 纳秒级时间函数time.time_ns() 等精度提升 3 倍
  7. UTF-8 强制模式-X utf8 / PYTHONUTF8=1
  8. 确定性 .pyc — 基于哈希的缓存验证
  9. dict 插入顺序保证 — 实现细节升格为语言规范
  10. 开发模式(-X dev — 严格运行时检查

Python 3.7 是一个异步基础设施与开发者体验双升级的版本。数据类和上下文变量的引入极大丰富了标准库的工具箱,而纳秒时间函数、开发模式、UTF-8 强制模式等改进则解决了长期困扰生产环境的实际问题。


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值