ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CPython 3.5.0a3 变更日志精读:从 NEWS.d 看字符串搜索提速、PEP 475 与 zipapp 等核心改动

CPython 3.5.0a3 变更日志精读:从 NEWS.d 看字符串搜索提速、PEP 475 与 zipapp 等核心改动 CPython 3.5.0a3 变更日志精读从 NEWS.d 看字符串搜索提速、PEP 475 与 zipapp 等核心改动【免费下载链接】cpythonThe Python programming language项目地址: https://gitcode.com/GitHub_Trending/cp/cpython本篇以 CPython 仓库中 3.5.0a3 变更日志 为主体完整梳理该预发布版本中 Core、Library、Build、Tests 与 Tools 五个类别的变更条目并结合当前仓库源码如 Objects/unicodeobject.c、Modules/timemodule.c、Lib/os.py逐条印证实现细节帮助你理解 3.5 早期版本在字符串性能、time.sleep信号重试PEP 475、zipapp打包PEP 441等方向上的关键演进。一、变更日志的位置与格式3.5.0a3.rst 位于 Misc/NEWS.d/ 目录这是 CPython 按版本归档的发布说明release notes。每条变更记录采用统一的 RST 结构.. bpo:—— 对应的 Bug/Enhancement Tracker 编号如23573.. date:/.. nonce:—— 内部排序与去重标识.. release date:—— 发布标签日期本文件为 2015-03-28对应 3.5.0a3.. section:—— 变更分类本文件涵盖Core and Builtins、Library、Build、Tests、Tools/Demos五个区段。理解这一格式后可以把下面的条目逐一映射到源码中去验证。二、核心解释器与内置对象Core and Builtins2.1 字符串搜索性能提升bpo-23573日志首条记录str.find、str.index、str.count、in运算符、str.split、str.partition在操作数宽度不同UCS1/UCS2/UCS4时性能提升。从源码结构看这一优化依托于 CPython 内置的stringlib字符串模板库Objects/unicodeobject.c 中多处包含stringlib/fastsearch.h见 L962–L993 一带的#include stringlib/fastsearch.h而 Objects/stringlib/ 目录提供了针对不同 Unicode 内部表示1 字节、2 字节、4 字节的查找算法变体。当“ haystack 与 needle 编码宽度不一致”这一常见场景被专门处理时跨宽度比较不再退化为昂贵的逐字符转换这正是日志所述“arguments of different kinds (UCS1, UCS2, UCS4)”的场景。2.2 平台支持stat()/fstat() 成为硬性要求bpo-23753日志声明 Python 不再支持缺少stat()或fstat()的平台这两个函数自此始终被要求存在。这意味着构建系统configure 阶段无需再为这类平台保留条件编译分支简化了 Modules/posixmodule.c 等系统接口模块的移植代码。2.3 其他核心条目逐条说明bpo变更内容说明与源码印证23681-bbytes 警告选项现在影响 bytes 与 int 的比较使用-b启动解释器后bytes int这类比较会触发BytesWarning帮助开发者尽早发现 bytes/str 混用23632memoryview 支持元组索引含多维 memoryview从 Objects/memoryobject.c 可见实现当索引为元组时逐维查表见lookup_dimensionL2488及“cannot index %d-dimension view with %zd-element tuple”的错误处理约 L2529越界时抛出 “index out of bounds on dimension N”23192修复 generator lambda此前lambda: (x for x in ...)一类生成器表达式写法存在缺陷补丁由 Bruno Cauet 提供修复后生成器 lambda 可正常迭代23629修复变长对象的默认__sizeof__实现默认__sizeof__由 Objects/object.c 提供此前对可变大小对象返回值不准确修复后sys.getsizeof()对这类对象给出可靠数值三、标准库变更Library按主题分组精读3.1 文件系统与流os.walk、os.urandom、os.truncateos.walk 改用 os.scandirbpo-23605os.walk()不再调用os.listdir()改用os.scandir()从而减少os.stat()调用次数遍历大目录树时开销明显下降。当前仓库 Lib/os.py 中walk()实现即以with scandir(top) as entries:L395为核心循环walk()的topdownFalse分支也使用scandir(topfd)L547。日志同时记载了首次引入时的原话“Initial patch written by Ben Hoyt”。os.urandom 使用 getrandom 系统调用bpo-22181在 Linux 上若内核可用3.17 引入的getrandom()syscall随机数生成改用该调用避免打开文件描述符、并在内核熵池就绪前阻塞等待可靠性与安全性更好。当前仓库中 Modules/posixmodule.c 的os_getrandom_implL17480展示了这一调用的现代形态优先直接调用getrandom()不可用时回退到syscall(SYS_getrandom, ...)L17497–L17499并在被信号中断时重试L17506 注释 “getrandom() was interrupted by a signal: retry”。Windows 支持 os.truncate / os.ftruncatebpo-23668这两个接口此前仅 POSIX 可用此版本起在 Windows 上同样支持截断文件不再需要平台分支代码。NamedTemporaryFile 迭代器持有实例引用bpo-23700遍历NamedTemporaryFile时迭代器保持对实例的强引用避免迭代过程中对象被 GC 回收导致句柄失效补丁Bohuslav Kabrda。BufferedRWPair 关闭顺序修复bpo-21802close()中即使 writer 关闭失败reader 也会被关闭防止资源泄漏。3.2 ZIP 与压缩生态x 模式、zipapp、不可定位流这是该版本 Library 部分最密集的主题之一ZipFile.open 支持 x 模式bpo-21717zipfile.ZipFile.open新增“独占创建”模式成员已存在时抛FileExistsError与open()文件语义对齐。当前 Lib/zipfile/init.py 中可查阅该模式的处理逻辑。新增 zipapp 模块bpo-23491PEP 441官方支持将 Python 代码打包成可执行的 zip 归档并在 Windows 上注册了.pyz/.pyzw扩展名。实现见 Lib/zipapp.py。zipapp 兼容 pathlib.Pathbpo-23657移除对str的显式类型检查允许传入pathlib.Path对象与整个标准库“路径对象通用化”的方向一致。ZIP 支持写入不可定位unseekable流bpo-23252此前向socket、管道等无法seek的流写 ZIP 会失败修复后 zipfile 可缓冲重写中央目录适配流式场景。gzip.GzipFile.write 支持任意 bytes-like 对象bpo-23688并消除了对memoryview的不必要拷贝原始补丁Wolfgang Maier。3.3 网络客户端http.client、imaplib、nntplib、cookieContent-Length 补齐bpo-23539http.client.HTTPConnection.request在body为None时对 PUT/POST/PATCH 主动设置Content-Length: 0避免部分 Web 服务器返回 411 Length Required。HTTP 头注入防护bpo-22928http.client禁止通过头名/头值中的换行符注入额外请求行原始补丁Demian Brecht属于安全加固。nntplib.NNTP 构造器不再泄漏连接bpo-22351此前若初始化中途失败socket 要等 GC 才释放现在构造失败立即清理补丁Martin Panter。imaplib.MAXLINE 提升bpo-23647适配现代大邮箱返回的长响应行。cookiejar 修复缺失键/值的 Cookie 解析bpo-23138补丁出自 Demian Brecht。http.cookies.Morsel 大改bpo-2211直接赋值key/value/coded_value弃用update()/setdefault()现在会对键做转换与校验相等性比较纳入上述三个属性copy()返回Morsel而非dictrepr()包含全部属性键检查与值加引号逻辑得到优化并新增测试原始补丁Demian Brecht。当前实现见 Lib/http/cookiejar.py。3.4 数据结构、格式化与文本处理deque 新增 index()/insert()/copy()bpo-23704collections.deque由此可注册为MutableSequence与list的可替换性增强。当前 Lib/collections/init.py 中deque.insertL1380、deque.copyL1392、deque.indexL1398即对应实现。pprint 系列三连OrderedDict的 pprint 输出与repr()一致bpo-23775支持映射代理对象mapping proxiesbpo-23502长 bytes/bytearray 换行折叠bpo-17530。textwrap 长词拆分修复bpo-22687修正断词边角情形并消除了长词拆分的二次复杂度长文本处理从 O(n²) 变为近似线性。re 模块两条groupindex变为不可修改映射bpo-14260防止外部篡改命名组表未知转义反斜杠 ASCII 字母先发出弃用警告日志预告“将在 Python 3.6 禁止”bpo-23622另有错误提示改进利用正则给出更明确的排错线索bpo-22364。string.Template / string.Formatter 支持关键字参数bpo-23671Template的self、Formatter的self与format_string均可按关键字传入便于子类与包装器调用。ntpath.expandvars 不再丢失不成对的单引号bpo-23742Windows 路径变量展开的引号处理修正。pydoc 分页器忽略 KeyboardInterruptbpo-23792与标准 Unix 分页器行为一致防止pipepager在 pager 仍在运行时被关闭。ctypes 移除 IsBadStringPtr 调用bpo-23765IsBadStringPtr在现代 Windows 上已被弃用且不可靠移除后指针合法性检查行为更一致。3.5 时间、信号与异常处理time.sleep 的 PEP 475 语义bpo-23646time.sleep()被信号中断后按重新计算的剩余时长重试除非信号处理函数抛异常。当前 Modules/timemodule.c 的底层sleep循环完整体现了这一模式先用单调时钟记下deadlineL2243–L2246在do...while中处理EINTRL2284经PyErr_CheckSignals()后若未抛出异常则用deadline - monotonic重算剩余时间再试L2295–L2304 注释 “retry with the recomputed delay”。signal.sigwaitinfo / sigtimedwait 重试bpo-23715被sigset之外的信号打断时自动重试且sigtimedwait重试时用单调时钟重算超时。traceback.format_list 修复bpo-23631对已被修改mutated的 traceback 对象不再出错。3.6 日期解析、拷贝协议与测试基础设施_strptime 周 0 日期统一处理bpo-23136包括上一年 12 月 30 日这类 ISO 周 0 的边角日期补丁Jim Carroll。copy 模块改用 pickle 协议 4bpo-4727PEP 3154并支持__new__带仅关键字参数的类实例拷贝。multiprocessing.Pool 的 imap 异常传播bpo-23051imap()/imap_unordered()现在会捕获并抛出迭代器本身抛出的异常补丁Alon Diamant、Davin Potts。unittest 加载失败的假测试用例可 picklebpo-22903unittest.loader在导入测试模块失败时创建的占位 TestCase 现在可以被序列化便于跨进程测试框架传输。MagicMock 补齐协议bpo-23568 / bpo-23581新增rdivmod与矩阵乘法matmul__matmul__系支持。faulthandler 支持文件描述符bpo-23566enable()、register()、dump_traceback()、dump_traceback_later()均接受 fd 参数补丁Wei Wu。timeit 可选输出单位bpo-18983基准测试输出不再只能以秒呈现补丁Julian Gindi。HtmlDiff.make_file 增加 charset 参数bpo-2052生成 HTML 差异报告时指定字符集。bz2 / tarfile / tokenize 可被 imp.reload 重新加载bpo-23615修复了这三个模块因顶层导入顺序问题无法热重载的缺陷补丁Thomas Kluyver。四、构建、测试与工具Build / Tests / Tools-Demosmake patchcheck 保证解释器已构建bpo-23585构建系统层面让补丁检查目标依赖解释器构建完成避免在缺失二进制的情况下运行检查。IDLE 标准 IO 流测试bpo-23583为 IDLE 内标准输入/输出/错误流补充测试覆盖。test_urllib2net 防 FTP 超时bpo-22289降低网络测试因 FTP 连接超时而误报失败的概率。Tools/freeze/bkfile.py 兼容性bpo-22826该工具中open()的返回值行为与普通文件对齐特别是支持上下文管理协议with语句。该文件在当前仓库仍保留于 Tools/freeze/bkfile.py。五、如何在当前仓库中验证这些变更以上每一条变更都可在当前 CPython 仓库中找到对应实现或测试定位文件按条目所属模块查源码如deque相关看 Lib/collections/init.pygetrandom系统调用看 Modules/posixmodule.csleep重试逻辑看 Modules/timemodule.c。定位测试标准库测试集中在 Lib/test/ 目录文件名通常为test_模块名.py如test_zipfile、test_time、test_deque可运行./python -m test test_zipfile之类的命令单独验证需先完成源码构建。追溯更多版本Misc/NEWS.d/ 下按3.x.yaN.rst命名的文件构成了完整的版本演进史相邻版本文件对照即可还原每个特性的引入与迭代过程。适用前提本文所有行号与代码引用基于当前仓库快照文中所述imp.reload、test_urllib2net等均为 3.5.0a3 时代的历史条目后续版本中部分机制已被importlib.reload()等替代阅读时请以对应年代的源码为准。【免费下载链接】cpythonThe Python programming language项目地址: https://gitcode.com/GitHub_Trending/cp/cpython创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表