PEP 3108 – 标准库重组
- 作者:
- Brett Cannon <brett at python.org>
- 状态:
- 最终
- 类型:
- 标准跟踪
- 创建:
- 2007年1月1日
- Python 版本:
- 3.0
- 历史记录:
- 2008年4月28日
注意
从 Python 3.3 开始,profile/cProfile 的合并没有发生,因此被认为已放弃(尽管将来这样做是可以接受的)。
摘要
就像 Python 语言本身一样,Python 的标准库 (stdlib) 这些年来发展壮大,变得非常丰富。但随着时间的推移,一些模块失去了被包含在 Python 中的必要性。自 Python 诞生以来,也引入了一种模块命名约定,但并非所有模块都遵循该约定。
Python 3.0 提供了一个机会来移除那些没有长期用处的模块。这个机会也允许重命名模块,以便它们遵循Python 风格指南。此 PEP 列出了不应包含在 Python 3.0 中或需要重命名的模块。
要移除的模块
Guido 宣布“愚蠢的老东西”将从 Py3K 的标准库中删除[8]。这是有意开放的。每个要移除的模块都需要有一个理由来解释为什么它不应该再与 Python 一起分发。这可以从模块在 Python 2.x 中被弃用到适用于不再广泛使用的平台。
此 PEP 的这一部分列出了要移除的各种模块。每个小节代表移除模块的不同原因。每个模块必须有具体的理由,除了列在特定的小节中之外,以确保只有真正应该移除的模块才会被移除。
当一个原因提到自一个模块“唯一编辑”以来已经多久了,它是指自专门针对该模块进行检入以来已经多久了,而不是针对应用于整个标准库的更改。如果编辑时间未标记为“唯一”,则表示文件最后一次被编辑的时间。
之前已弃用 [已完成]
PEP 4 列出了标准库中所有已弃用的模块。指定的动机反映了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 操作系统不再生产[15]。由于这个事实,移除 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 [12])。
- ERRNO
- 未记录。
- FILE
- 未记录。
- FL/fl/flp
- FORMS 库的包装器[16]
- FORMS 12 年来没有被编辑过。
- 库没有得到广泛使用。
- Google 上的前八个结果都是关于 fl 的 Python 文档。
- fm
- IRIS 字体管理器库的包装器。
- 仅在不再提供 IRIX 的 SGI 机器上可用。
- GET
- 未记录。
- GLWS
- 未记录。
- imgfile
- SGI libimage 库的包装器,用于 imglib 图像文件(
.rgb
文件)。 - Python 图像库提供只读支持[13]。
- 13 年来没有被唯一编辑过。
- SGI libimage 库的包装器,用于 imglib 图像文件(
- IN
- 未记录。
- IOCTL
- 未记录。
- jpeg
- JPEG(解)压缩器的包装器。
- 代码九年来没有被唯一编辑过。
- 第三方库提供更好的支持(Python 图像库[13])。
- panel
- 未记录。
- panelparser
- 未记录。
- readcd
- 未记录。
- SV
- 未记录。
- torgb
- 未记录。
- WAIT
- 未记录。
Mac 特定模块
Mac 特定模块维护不善(例如,用于自动生成许多模块的 bgen 工具从未更新以支持 UCS-4)。维护如此大量的操作系统特定模块也不是 Python 的职责。因此,Lib/plat-mac
和 Mac
下的所有模块都将被移除。
将提供一个存根模块用于代理访问,供 urllib 使用。
- _builtinSuites
- 未记录。
- lib-scriptpackages 下的包。
- Audio_mac
- 未记录。
- aepack
- OSA 支持可以通过第三方模块更好地实现。
- Appscript [18]。
- 硬编码的字节序,在 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 从未更新以支持 UCS-4 Unicode 版本的 Python。
- CodeWarrior
- 未记录。
- lib-scriptpackages 下的包。
- ColorPicker
- 最好使用 Cocoa 创建 GUI。
- EasyDialogs
- 最好使用 Cocoa 创建 GUI。
- Explorer
- 未记录。
- lib-scriptpackages 下的包。
- Finder
- 未记录。
- lib-scriptpackages 下的包。
- findertools
- 不再有用。
- FrameWork
- 文档记录不佳。
- 未更新以支持 Carbon 事件。
- 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
- 通过允许应用程序指定自己的模块名称、检查是否存在并在找到时导入来轻松处理。
- new
- 只是来自“types”模块的名称重新绑定。
- 还可以调用
type
内置函数来轻松获取大多数类型。 - 文档字符串指出自修订版 27241(2002-06-15)以来,该模块不再有用。
- pure
- 在 Pure Atria 被 Rational 收购,然后 Rational 被 IBM 收购之前编写(换句话说,非常古老)。
- test.testall
- 在 regrtest 出现之前的时代。
已过时
变得过时意味着标准库中的另一个模块或广泛分发的第三方库为模块的目的提供了更好的解决方案。
- Bastion/rexec [已完成]
- 受限执行/安全。
- 在 Python 2.3 中关闭。
- 被认为不安全的模块。
- bsddb185 [已完成]
- 被 bsddb3 取代
- 默认情况下不构建。
- 文档说明“模块永远不应该在新的代码中直接使用”。
- 可从 PyPI 外部获取。
- Canvas [已完成]
- 自 2000 年以来,Guido 在注释中将其标记为已过时(参见 http://bugs.python.org/issue210677)。
- 最好使用
Tkinter.Canvas
类。
- 命令 [已完成]
- subprocess 模块替换它(PEP 324)。
- 移除 getstatus(),将其余部分移动到 subprocess。
- 编译器 [已完成]
- dircache [已完成]
- 使用量可忽略不计。
- 易于复制。
- dl [已完成]
- ctypes 为相同功能提供了更好的支持。
- fpformat [已完成]
- 字符串插值支持所有功能。
- htmllib [已完成]
- 被 HTMLParser 取代。
- ihooks [已完成]
- 未记录。
- 用于 rexec,自 Python 2.3 以来已被禁用。
- imageop [已完成]
- 第三方库(Python 图像库 [13])提供了更好的支持。
- 单元测试依赖于 rgbimg 和 imgfile。
- rgbimg 在 Python 2.6 中被移除。
- imgfile 计划在本 PEP 中移除。
- linuxaudiodev [已完成]
- 被 ossaudiodev 替换。
- mhlib [已完成]
- 应作为单个模块移除;请改用
mailbox
。
- 应作为单个模块移除;请改用
- popen2 [已完成]
- subprocess 模块替换它(PEP 324)。
- sgmllib [已完成]
- 无法完全解析 SGML。
- 在标准库中用于支持 htmllib,后者计划移除。
- sre [已完成]
- 之前已弃用;请改用
re
导入。
- 之前已弃用;请改用
- stat [待办事项 需要将所有用法迁移到
os.stat()
]os.stat()
现在返回一个包含属性的元组。- 模块中的函数应转换为由 os.stat 返回的对象的方法。
- statvfs [已完成]
os.statvfs
现在返回一个包含属性的元组。
- thread [已完成]
- 人们应该使用“threading”代替。
- 将“thread”重命名为 _thread。
- 弃用 dummy_thread 并重命名为 _dummy_thread。
- 将 thread.get_ident 移动到 threading。
- Guido 之前支持弃用 [9]。
- 人们应该使用“threading”代替。
- urllib [已完成]
- 被 urllib2 取代。
- urllib 独有的功能将保留在 urllib 包中。
- UserDict [已完成:3.0] [待办事项 处理 2.6]
- 自从类型可以成为超类以来,它就不那么有用了。
- 有用的部分已移至“collections”模块。
- UserList/UserString [已完成]
- 自从类型可以成为超类以来,它就不那么有用了。
- 已移至“collections”模块。
维护负担
多年来,某些模块已成为 python-dev 维护的沉重负担。在这种情况下,最好将模块交给社区维护,以便 python-dev 能够更加专注于语言支持和标准库中其他不占用过多时间和精力的模块。
- bsddb3
- 在 http://www.jcea.es/programacion/pybsddb.htm 外部维护。
- 测试不稳定性。
- Berkeley DB 遵循与 Python 不同的发布计划,导致绑定不一定与可用版本同步。
要重命名的模块
许多模块在 PEP 8 出现之前就存在于标准库中。这导致了一些命名不一致和命名空间膨胀,应予以解决。
PEP 8 违规 [已完成]
PEP 8 指定模块“应具有简短的全小写名称”,其中“如果可以提高可读性,可以使用下划线”。在包名称中不鼓励使用下划线。以下模块违反了 PEP 8,并且没有通过移动到包来重命名。
当前名称 | 替换名称 |
---|---|
_winreg | winreg |
ConfigParser | configparser |
copy_reg | copyreg |
Queue | queue |
SocketServer | socketserver |
合并同一接口的 C 和 Python 实现
一些接口同时具有 Python 和 C 实现。虽然拥有 C 实现以提高速度并使用 Python 实现作为回退非常棒,但无需在标准库中独立公开这两种实现。对于 Python 3.0,所有具有两种实现的接口都将合并到单个公共接口中。
C 模块将使用前导下划线来表明它不是参考实现(Python 实现是)。这意味着在 Python 3.0 之前必须处理 C 版本和 Python 版本之间的任何语义差异,否则 C 实现将被移除,直到可以修复它为止。
下面未列出的一个接口是 xml.etree.ElementTree。这是一个由外部维护的模块,因此不受 Python 开发团队的直接控制以进行重命名。有关此方面的讨论,请参阅 未解决问题。
- pickle/cPickle [已完成]
- 将 cPickle 重命名为 _pickle。
- 未验证 C 实现的语义完整性。
- profile/cProfile [待办事项]
- 将 cProfile 重命名为 _profile。
- 未验证 C 实现的语义完整性。
- StringIO/cStringIO [已完成]
- 将类添加到“io”模块。
没有公共的、有文档记录的接口 [已完成]
标准库中有一些模块没有定义公共接口。这些模块作为其他模块的支持代码存在。因为它们不打算直接使用,所以应该重命名以反映这一事实。
当前名称 | 替换名称 |
---|---|
markupbase | _markupbase |
名称选择不佳 [已完成]
一些模块的名称在事后看来选择不佳。应重命名它们,以防止其不良名称延续到 2.x 系列之外。
当前名称 | 替换名称 |
---|---|
repr | reprlib |
test.test_support | test.support |
模块分组 [已完成]
随着标准库的增长,其中的几个区域已经扩展到包含多个模块(例如,对数据库文件的支持)。因此,将相关模块分组到包中是有意义的。
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 中
- 移除模块。
- 移除相关的测试。
- 移除所有文档(通常是模块的文档文件及其在库参考文件中的条目)。
- 如果需要,编辑
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 捆绑包包含一个命令,可以为您生成所有这些内容)。 - 更新文档。对于具有自身文档文件的模块,请使用
:deprecated:
选项与module
指令一起使用,并使用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 重构工具将支持重命名,这将帮助人们过渡到新的模块名称 [11]。导入语句将被重写,以便只需要修改导入语句,而无需修改代码的其余部分。这将通过在导入语句中使用 as
关键字将模块命名空间绑定到旧名称,同时根据新名称进行导入来实现(当关键字尚未使用时,否则应保留重新分配的名称,并且只需要更改导入的模块)。fix_imports
修复程序就是一个如何处理此问题的示例。
Python 3.0
- 更新沙盒中的 2to3 以支持重命名。
- 使用
svn move
重命名模块。 - 更新标准库中所有使用旧名称的导入语句,以使用新名称(使用 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 中阻止修订。
未解决的问题
标准库之外维护的模块重命名
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 工具包。
引入新的顶级包
有人建议将整个标准库放在其自己的包中。此 PEP 不会解决此问题,因为它本身存在设计问题(命名、它是否在导入语义中值得特殊考虑等)。如果引入了新的顶级包,则此 PEP 中的所有内容都可以轻松处理。
参考文献
版权
本文档已进入公有领域。
来源:https://github.com/python/peps/blob/main/peps/pep-3108.rst
上次修改时间:2023-09-09 17:39:29 GMT