PEP 3108 – 标准库重组
- 作者:
- Brett Cannon <brett at python.org>
- 状态:
- 最终版
- 类型:
- 标准跟踪
- 创建日期:
- 2007年1月1日
- Python 版本:
- 3.0
- 发布历史:
- 2008年4月28日
注意
profile/cProfile 在 Python 3.3 中没有合并,因此被视为已放弃(尽管将来这样做是可以接受的)。
摘要
就像语言本身一样,Python 的标准库 (stdlib) 多年来变得非常丰富。但随着时间的推移,一些模块已不再需要包含在 Python 中。自 Python 诞生以来,模块命名约定也已引入,但并非所有模块都遵循。
Python 3.0 提供了一个机会来移除那些没有长期用处的模块。这个机会也允许重命名模块,使其遵循 Python 风格指南。本 PEP 列出了不应包含在 Python 3.0 中或需要重命名的模块。
待移除模块
Guido 宣布将从 Py3K 的 stdlib 中删除“愚蠢的旧东西”[7]。这是故意开放式的。每个待移除的模块都需要说明为什么不应再随 Python 分发。这可以包括模块在 Python 2.x 中已弃用,或用于不再广泛使用的平台。
本 PEP 的这一部分列出了要移除的各种模块。每个小节代表模块被移除的不同原因。除了在特定小节中列出之外,每个模块都必须有具体的理由,以确保只移除那些真正应该移除的模块。
当一个原因提到一个模块“唯一编辑”的时间长度时,指的是专门针对该模块进行的签入,而不是适用于整个 stdlib 的普遍更改。如果编辑时间未注明为“唯一”,那么就是文件的最后一次编辑。
此前已弃用 [完成]
PEP 4 列出了 stdlib 中所有已弃用的模块。指定的动机与 PEP 4 中列出的动机相同。在 Python 3.0 的第一个 Alpha 版本发布时,PEP 中列出的所有模块都将被移除。
lib-old 的全部内容也将被移除。这些模块已从导入中移除,但为了依赖这些代码的用户,仍保留在 Python 发行版中。
- cfmfile
- 自 Python 2.4 起已文档化为已弃用,无明确原因。
- cl
- 自 Python 2.0 或更早版本起已文档化为过时。
- SGI 硬件接口。
- md5
- 已被
hashlib模块取代。
- 已被
- mimetools
- 在以前的版本中已文档化为过时。
- 已被
email包取代。
- MimeWriter
- 已被
email包取代。
- 已被
- mimify
- 已被
email包取代。
- 已被
- multifile
- 已被
email包取代。
- 已被
- posixfile
- 使用
fcntl.lockf()进行锁定效果更好。
- 使用
- rfc822
- 已被
email包取代。
- 已被
- sha
- 已被
hashlib包取代。
- 已被
- sv
- 自 Python 2.0 或更早版本起已文档化为过时。
- 已过时的 SGI Indigo 硬件接口。
- timing
- 自 Python 2.0 或更早版本起已文档化为过时。
time.clock()提供更好的时间分辨率。
平台特定且使用量极少 [完成]
Python 支持许多平台,其中一些平台并未广泛使用或维护。在这些平台中的某些平台上,有些模块对这些平台上的用户用途有限。由于其用途有限,最好不再给 Python 开发团队增加维护负担。
下面提到的模块已文档化。所有指定平台的未文档化模块也将被移除。
IRIX
IRIX 操作系统已不再生产 [13]。因此,移除 plat-irix[56] 目录中的所有模块被认为是合理的。
- AL/al
- 在 Indy 和 Indigo 工作站上提供声音支持。
- 这两种工作站都已不再可用。
- 代码三年内未被唯一编辑过。
- cd/CD
- SGI 系统的 CD 驱动器控制。
- SGI 不再销售带有 IRIX 的机器。
- 代码 14 年内未被唯一编辑过。
- cddb
- 未文档化。
- cdplayer
- 未文档化。
- cl/CL/CL_old
- SGI 系统的压缩库。
- SGI 不再销售带有 IRIX 的机器。
- 代码 14 年内未被唯一编辑过。
- DEVICE/GL/gl/cgen/cgensuport
- GL 访问,它是 OpenGL 的前身。
- 至少八年未被编辑过。
- 第三方库提供更好的支持 (PyOpenGL [10])。
- ERRNO
- 未文档化。
- FILE
- 未文档化。
- FL/fl/flp
- FORMS 库的包装器 [14]
- FORMS 12 年内未被编辑过。
- 该库未被广泛使用。
- Google 搜索前八个结果是 fl 的 Python 文档。
- fm
- IRIS 字体管理器库的包装器。
- 仅在不再附带 IRIX 的 SGI 机器上可用。
- GET
- 未文档化。
- GLWS
- 未文档化。
- imgfile
- SGI libimage 库用于 imglib 图像文件(
.rgb文件)的包装器。 - Python Imaging Library 提供只读支持 [11]。
- 13 年内未被唯一编辑过。
- SGI libimage 库用于 imglib 图像文件(
- IN
- 未文档化。
- IOCTL
- 未文档化。
- jpeg
- JPEG (解)压缩器的包装器。
- 代码九年内未被唯一编辑过。
- 第三方库提供更好的支持 (Python Imaging Library [11])。
- panel
- 未文档化。
- panelparser
- 未文档化。
- readcd
- 未文档化。
- SV
- 未文档化。
- torgb
- 未文档化。
- WAIT
- 未文档化。
Mac专用模块
Mac 专用模块维护不佳(例如,用于自动生成许多模块的 bgen 工具从未更新以支持 UCS-4)。Python 也不是维护如此大量 OS 特定模块的地方。因此,Lib/plat-mac 和 Mac 下的所有模块都将被移除。
将提供一个用于 urllib 的代理访问存根模块。
- _builtinSuites
- 未文档化。
- lib-scriptpackages 下的包。
- Audio_mac
- 未文档化。
- aepack
- 通过第三方模块更好地支持 OSA。
- Appscript [15]。
- 硬编码的字节序在 Intel Mac 上会出错。
- 如果依赖 Carbon 包可能需要重命名。
- 通过第三方模块更好地支持 OSA。
- aetools
- 参见 aepack。
- aetypes
- 参见 aepack。
- applesingle
- 未文档化。
- AppleSingle 是 A/UX 的二进制文件格式。
- A/UX 已不再分发。
- appletrawmain
- 未文档化。
- appletrunner
- 未文档化。
- argvemulator
- 未文档化。
- autoGIL
- 使用 Python 与 CFRunLoop 的模型非常糟糕。
- bgenlocations
- 未文档化。
- buildtools
- 自 Python 2.3 起已文档化为已弃用,无明确原因。
- bundlebuilder
- 未文档化。
- Carbon
- Carbon 开发已停止。
- 不完全支持 64 位系统。
- 依赖 bgen,而 bgen 从未更新以支持 Python 的 UCS-4 Unicode 构建。
- CodeWarrior
- 未文档化。
- lib-scriptpackages 下的包。
- ColorPicker
- 最好使用 Cocoa 构建 GUI。
- EasyDialogs
- 最好使用 Cocoa 构建 GUI。
- Explorer
- 未文档化。
- lib-scriptpackages 下的包。
- Finder
- 未文档化。
- lib-scriptpackages 下的包。
- findertools
- 不再有用。
- FrameWork
- 文档不佳。
- 未更新以支持 Carbon Events。
- gensuitemodule
- 参见 aepack。
- ic
- icglue
- icopen
- 在 OS X 上不需要。
- 旨在替换“open”,这通常是一件坏事。
- macerrors
- 未文档化。
- MacOS
- 也将意味着移除 binhex。
- macostools
- macresource
- 未文档化。
- MiniAEFrame
- 参见 aepack。
- Nav
- 未文档化。
- Netscape
- 未文档化。
- lib-scriptpackages 下的包。
- OSATerminology
- pimp
- 未文档化。
- PixMapWrapper
- 未文档化。
- StdSuites
- 未文档化。
- lib-scriptpackages 下的包。
- SystemEvents
- 未文档化。
- lib-scriptpackages 下的包。
- Terminal
- 未文档化。
- lib-scriptpackages 下的包。
- terminalcommand
- 未文档化。
- videoreader
- 不再使用。
- W
- 不再随 Python 分发。
Solaris
- SUNAUDIODEV/sunaudiodev
- 访问 Sun 机器上的声卡。
- 代码八年多未被唯一编辑过。
极少使用 [完成]
一些平台无关模块很少使用。这有许多可能的解释,包括:重新实现简单、受众很小或不遵守更现代的标准。
- audiodev
- 未文档化。
- 五年未编辑。
- imputil
- 未文档化。
- 从未更新以支持绝对导入。
- mutex
- 使用信号量和队列易于实现。
- 无法在尝试锁定时阻塞。
- 自 15 年前添加以来未被唯一编辑过。
- 仅对“sched”模块有用。
- 非线程安全。
- stringold
- 字符串对象方法的函数版本。
- 自 Python 1.6 起已过时。
- 字符串对象或模块中不存在的任何功能将移至字符串模块(主要是常量)。
- sunaudio
- 未文档化。
- 七年多未编辑。
sunau模块提供类似功能。
- toaiff
- 未文档化。
- 要求在系统上安装
sox库。
- user
- 通过允许应用程序指定自己的模块名称、检查是否存在并找到后导入来轻松处理。
- 新
- 只是“types”模块中名称的重新绑定。
- 也可以调用
type内置函数以轻松获取大多数类型。 - 文档字符串声明该模块自修订版 27241 (2002-06-15) 起不再有用。
- pure
- 在 Pure Atria 被 Rational 收购,然后又被 IBM 收购之前编写(换句话说,非常旧)。
- test.testall
- 在 regrtest 之前的时代。
已过时
过时意味着 stdlib 中的另一个模块或广泛分发的第三方库为该模块旨在实现的功能提供了更好的解决方案。
- Bastion/rexec [完成]
- 受限执行/安全。
- 在 Python 2.3 中已关闭。
- 被认为不安全的模块。
- bsddb185 [完成]
- 被 bsddb3 取代
- 默认不构建。
- 文档中明确指出“在新代码中不应直接使用该模块”。
- 可从 PyPI 外部获取。
- Canvas [完成]
- 自 2000 年起 Guido 在注释中标记为过时(参见 http://bugs.python.org/issue210677)。
- 最好使用
Tkinter.Canvas类。
- commands [完成]
- subprocess 模块取代了它 (PEP 324)。
- 移除 getstatus(),其余移至 subprocess。
- compiler [完成]
- dircache [完成]
- 使用量微乎其微。
- 易于复制。
- dl [完成]
- ctypes 为相同功能提供更好的支持。
- fpformat [完成]
- 所有功能都由字符串插值支持。
- htmllib [完成]
- 被 HTMLParser 取代。
- ihooks [完成]
- 未文档化。
- 用于 rexec,而 rexec 自 Python 2.3 起已关闭。
- imageop [完成]
- 第三方库提供更好的支持 (Python Imaging Library [11])。
- 单元测试依赖 rgbimg 和 imgfile。
- rgbimg 在 Python 2.6 中已移除。
- imgfile 在本 PEP 中计划移除。
- linuxaudiodev [完成]
- 被 ossaudiodev 取代。
- mhlib [完成]
- 应作为单独模块移除;改用
mailbox。
- 应作为单独模块移除;改用
- popen2 [完成]
- subprocess 模块取代了它 (PEP 324)。
- sgmllib [完成]
- 无法完全解析 SGML。
- 在 stdlib 中用于支持 htmllib,而 htmllib 计划移除。
- sre [完成]
- 此前已弃用;改用导入
re。
- 此前已弃用;改用导入
- stat [TODO 需要将所有使用移至
os.stat()]os.stat()现在返回一个带有属性的元组。- 模块中的函数应作为 os.stat 返回的对象的方法。
- statvfs [完成]
os.statvfs现在返回一个带有属性的元组。
- thread [完成]
- 人们应该改用“threading”。
- 将“thread”重命名为 _thread。
- 弃用 dummy_thread 并重命名为 _dummy_thread。
- 将 thread.get_ident 移至 threading。
- Guido 此前曾支持弃用 [8]。
- 人们应该改用“threading”。
- urllib [完成]
- 被 urllib2 取代。
- urllib 独有的功能将保留在 urllib 包中。
- UserDict [完成: 3.0] [TODO 处理 2.6]
- 由于类型可以成为超类,因此不再那么有用。
- 有用的部分移至“collections”模块。
- UserList/UserString [完成]
- 由于类型可以成为超类,因此不再有用。
- 移至“collections”模块。
维护负担
多年来,某些模块已成为 python-dev 维护的沉重负担。在这种情况下,最好将模块交给社区维护,以使 python-dev 能够更多地关注语言支持和标准库中不会占用过多时间和精力的其他模块。
- bsddb3
- 在 http://www.jcea.es/programacion/pybsddb.htm 外部维护。
- 持续的测试不稳定。
- Berkeley DB 遵循与 Python 不同的发布计划,导致绑定不一定与可用内容同步。
待重命名模块
在 PEP 8 出现之前,stdlib 中存在许多模块。这导致了一些命名不一致和命名空间膨胀,应该加以解决。
违反 PEP 8 [完成]
PEP 8 规定模块“应该有简短、全小写的名称”,其中“如果能提高可读性,可以使用下划线”。包名中不鼓励使用下划线。以下模块违反了 PEP 8,并且不会通过移动到包中而以某种方式重命名。
| 当前名称 | 替换名称 |
|---|---|
| _winreg | winreg |
| ConfigParser | configparser |
| copy_reg | copyreg |
| Queue | queue |
| SocketServer | socketserver |
合并相同接口的 C 和 Python 实现
一些接口同时具有 Python 和 C 实现。虽然拥有 C 实现以提高速度并将 Python 实现作为备用是很好的,但没有必要在 stdlib 中独立公开这两种实现。对于 Python 3.0,所有具有两种实现的接口将合并为一个公共接口。
C 模块将添加一个前导下划线,以区分它不是参考实现(Python 实现是)。这意味着 C 和 Python 版本之间的任何语义差异都必须在 Python 3.0 之前处理,否则 C 实现将被移除,直到可以修复。
下面未列出的一个接口是 xml.etree.ElementTree。这是一个外部维护的模块,因此不在 Python 开发团队的直接重命名控制之下。有关此问题的讨论,请参阅开放问题。
- pickle/cPickle [完成]
- 将 cPickle 重命名为 _pickle。
- C 实现的语义完整性 未 验证。
- profile/cProfile [TODO]
- 将 cProfile 重命名为 _profile。
- C 实现的语义完整性 未 验证。
- StringIO/cStringIO [完成]
- 将该类添加到“io”模块。
无公共、已文档化接口 [完成]
stdlib 中有几个模块没有定义公共接口。这些模块作为其他公开模块的支持代码存在。因为它们不应直接使用,所以应该重命名以反映这一事实。
| 当前名称 | 替换名称 |
|---|---|
| markupbase | _markupbase |
命名不佳 [完成]
事后看来,有些模块的命名选择不佳。它们应该重命名,以防止其不良名称在 2.x 系列之后继续存在。
| 当前名称 | 替换名称 |
|---|---|
| repr | reprlib |
| test.test_support | test.support |
模块分组 [完成]
随着 stdlib 的发展,其中几个领域已扩展到包含多个模块(例如,对数据库文件的支持)。因此,将相关模块分组到包中是有意义的。
dbm 包
| 当前名称 | 替换名称 |
|---|---|
| anydbm | dbm.__init__ [1] |
| dbhash | dbm.bsd |
| dbm | dbm.ndbm |
| dumbdm | dbm.dumb |
| gdbm | dbm.gnu |
| whichdb | dbm.__init__ [1] |
html 包
| 当前名称 | 替换名称 |
|---|---|
| HTMLParser | html.parser |
| htmlentitydefs | html.entities |
http 包
| 当前名称 | 替换名称 |
|---|---|
| httplib | http.client |
| BaseHTTPServer | http.server [2] |
| CGIHTTPServer | http.server [2] |
| SimpleHTTPServer | http.server [2] |
| Cookie | http.cookies |
| cookielib | http.cookiejar |
http.server 模块可以安全地合并指定的模块,因为它们没有命名冲突。tkinter 包
| 当前名称 | 替换名称 |
|---|---|
| Dialog | tkinter.dialog |
| FileDialog | tkinter.filedialog [4] |
| FixTk | tkinter._fix |
| ScrolledText | tkinter.scrolledtext |
| SimpleDialog | tkinter.simpledialog [5] |
| Tix | tkinter.tix |
| Tkconstants | tkinter.constants |
| Tkdnd | tkinter.dnd |
| Tkinter | tkinter.__init__ |
| tkColorChooser | tkinter.colorchooser |
| tkCommonDialog | tkinter.commondialog |
| tkFileDialog | tkinter.filedialog [4] |
| tkFont | tkinter.font |
| tkMessageBox | tkinter.messagebox |
| tkSimpleDialog | tkinter.simpledialog [5] |
| turtle | tkinter.turtle |
tkinter.filedialog 可以安全地合并 FileDialog 和 tkFileDialog,因为没有命名冲突。tkinter.simpledialog 可以安全地合并 SimpleDialog 和 tkSimpleDialog,因为没有命名冲突。urllib 包
最初,这个新包被命名为 url,但由于该名称常被用作变量,因此最好保留名称 urllib,而是将现有模块移入新包。
| 当前名称 | 替换名称 |
|---|---|
| urllib2 | urllib.request, urllib.error |
| urlparse | urllib.parse |
| urllib | urllib.parse, urllib.request, urllib.error [6] |
| robotparser | urllib.robotparser |
urllib 中与引用相关的函数将添加到 urllib.parse 中。urllib.URLOpener 和 urllib.FancyUrlOpener 将添加到 urllib.request 中,只要这两个模块的文档都更新。xmlrpc 包
| 当前名称 | 替换名称 |
|---|---|
| xmlrpclib | xmlrpc.client |
| DocXMLRPCServer | xmlrpc.server [3] |
| SimpleXMLRPCServer | xmlrpc.server [3] |
xmlrpc.server 的模块没有命名冲突,因此可以安全地合并。过渡计划
问题
与本 PEP 相关的问题
关于待移除模块
对于模块移除,最简单的方法是首先在 Python 3.0 中移除模块,以查看依赖关系是否存在。这使得查找(可能)需要抑制 DeprecationWarning 的代码变得更容易。
在 Python 3.0 中
- 移除模块。
- 移除相关测试。
- 移除所有文档(通常是模块的文档文件及其在 Library Reference 文件中的条目)。
- 如有必要,编辑
Modules/Setup.dist和setup.py。 - 运行回归测试套件(使用
-uall);注意因移除模块导入失败而跳过的测试。 - 提交更改(附带适当的
Misc/NEWS条目)。 - 更新本 PEP,注明 3.0 步骤已完成。
在 Python 2.6 中
- 如果模块用 Python 实现,则将以下代码作为第一段执行的代码添加到已弃用模块中(根据需要调整模块名称和
warnings导入)from warnings import warnpy3k warnpy3k("the XXX module has been removed in Python 3.0", stacklevel=2) del warnpy3k
如果它是扩展模块,则为以下代码
if (PyErr_WarnPy3k("the XXX module has been removed in " "Python 3.0", 2) < 0) return;
(可从
Misc/TextMate获取的 Python-Dev TextMate bundle 包含一个命令,可以为您生成所有这些内容)。 - 更新文档。对于有自己文档文件的模块,使用带有
module指令的:deprecated:选项以及deprecated指令,说明弃用发生在 2.6 中,但目的是在 3.0 中移除该模块。.. deprecated:: 2.6 The :mod:`XXX` module has been removed in Python 3.0.
对于仅列在文件中的模块(例如,
undoc.rst),使用warning指令。 - 将模块添加到
test_py3kwarn中的模块删除测试。 - 使用以下代码抑制模块测试代码中的警告
test.test_support.import_module(name, deprecated=True).
- 提交更改并附带适当的
Misc/NEWS条目(在py3k中 阻止 此提交!)。 - 更新本 PEP,注明 2.6 步骤已完成。
模块重命名
2to3 重构工具中对重命名的支持将用于帮助人们过渡到新的模块名称 [9]。import 语句将被重写,以便只需更改 import 语句,而不需要更改其余代码。这将通过在 import 语句中使用 as 关键字将模块命名空间绑定到旧名称,同时根据新名称进行导入(当关键字尚未被使用时,否则应保留重新分配的名称,并且只更改被导入的模块)。fix_imports 修复器是如何实现这一点的示例。
Python 3.0
- 更新沙箱中的 2to3 以支持重命名。
- 使用
svn move重命名模块。 - 更新 stdlib 中的所有 import 语句以使用新名称(使用 2to3 的
fix_imports修复器以获得最简单的解决方案)。 - 在模块自己的文档中重命名模块。
- 更新文档中所有从旧名称到新名称的引用。
- 运行
regrtest.py -uall以验证重命名是否有效。 - 在
Misc/NEWS中添加一个条目。 - 提交更改。
Python 2.6
- 在模块的文档中,添加一个注释,提及该模块在 Python 3.0 中已重命名。
.. note:: The :mod:`OLDNAME` module has been renamed to :mod:`NEWNAME` in Python 3.0.
- 提交文档更改。
- 在 py3k 中阻止修订。
未解决的问题
在 stdlib 之外维护的模块重命名
xml.etree.ElementTree 不仅不符合 PEP 8 命名标准,而且还公开了 C 实现。它是一个外部维护的包,尽管有 PEP 360。将请求维护者更改名称,使其符合 PEP 8 并隐藏 C 实现。
被拒绝的想法
最初建议移除的模块
- asynchat/asyncore
- Josiah Carlson 表示他将维护这些模块。
- audioop/sunau/aifc
- 仍然使用这些格式的音频模块。
- base64/quopri/uu
- 都仍然广泛使用。
- “codecs”模块对于基本使用不提供那么好的 API。
- fileinput
- 在处理标准输入时很有用。
- linecache
- 在多个地方内部使用。
- nis
- 有证词表明 NIS 新安装仍在发生
- getopt
- 比 optparse 更简单。
- repr
- 作为重写的基础很有用。
- 内部使用。
- sched
- 对模拟很有用。
- symtable/_symtable
- 已编写文档。
- telnetlib
- 对于快速简单的远程访问非常方便。
- 某些硬件支持使用 telnet 进行配置和查询。
- Tkinter
- 将阻止 IDLE 的存在。
- 开箱即用将没有 GUI 工具包。
引入新的顶层包
有人建议将整个 stdlib 放置在自己的包中。本 PEP 不会解决此问题,因为它有自己的设计问题(命名,它是否值得在导入语义中特别考虑等)。如果引入新的顶层包,本 PEP 中的所有内容都可以轻松处理。
参考资料
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-3108.rst