添加到 stdlib¶
虽然 stdlib 包含大量有用的代码,但有时你需要更多内容。本文档旨在说明如何将新内容添加到 stdlib 中的现有模块,或添加一个全新的模块。
不涵盖对现有代码的更改,因为这被视为错误修复,因此被视为应提交到 问题跟踪器 中的错误。
添加到现有模块¶
如果你发现某个函数、方法或类很有用,并且你认为它对 Python 社区有用,那么需要执行一些步骤才能将其添加到 stdlib 中。
首先,你应该衡量代码的实用性,这通常是通过公开共享代码来完成的。这不是必需的步骤,但建议这样做。你可以选择以下几种方法
在 问题跟踪器 中搜索与提议的添加内容相关的讨论。这可能会发现解释为什么该建议未被接受的问题。
在 Ideas Discourse 类别 中打开一个新主题,以直接从 Python 核心开发者和社区收集反馈。
撰写一篇关于代码的博客文章,这也有助于收集有用的反馈。
将其发布到 Python Cookbook。根据对该食谱的反馈和评论,你可以了解其他人是否像你一样觉得该功能有用。
如果你发现人们普遍接受并认可你的代码,则可以在 问题跟踪器 上打开一个问题,并将代码作为 pull 请求 附加。如果可能,还应提交 贡献者协议。
如果核心开发者决定你的代码对 Python 社区有用,他们将提交你的代码。如果你的代码未被核心开发者选中并提交,请不要因此而耿耿于怀。通过公开分享你的代码以衡量社区对它的支持,你至少可以知道其他人会发现它有用。
添加新模块¶
必须预先说明,将新模块添加到 stdlib 非常困难。向 stdlib 添加任何数量级的代码都会增加核心开发者的负担。这也意味着该模块在某种程度上被核心开发者“认可”为完成某项任务的好方法,通常会导致 Python 社区的其他成员使用新模块而不是其他可用解决方案。所有这些都意味着对 stdlib 的添加并非轻而易举。
可接受的模块类型¶
通常有两种类型的模块会被添加到 stdlib 中。一种类型是实现某些难以正确实现的模块。一个很好的例子是 multiprocessing
包。解决各种操作系统问题、解决并发问题等都很难正确实现。
第二种类型的模块是实现人们不断重新实现的模块。 itertools
模块就是此类模块的一个很好的例子,因为它的组成部分不一定复杂,但经常在各种程序中使用,并且可能有点难以正确实现。解析广泛使用的数据格式的模块也属于 stdlib 包含的此类模块。
虽然新的 stdlib 模块不必吸引所有 Python 用户,但它应该是社区的大部分成员会觉得有用的东西。这可以确保对核心开发者施加的开发者负担是值得的。
要求¶
为了让模块被考虑纳入 stdlib,必须满足几个要求。
最基本的要求是代码必须满足标准补丁要求。对于在 stdlib 之外开发的代码,通常这意味着确保遵循编码风格指南并且编写了适当的测试。
该模块至少需要在社区中发布一年。由于 Python 在向后兼容性方面具有保守性,因此当模块添加到 stdlib 中时,其 API 将被冻结。这意味着只有当模块成熟并经历了“成长烦恼”后,才应将其纳入 stdlib。
该模块需要被认为是同类最佳。当某个内容包含在 stdlib 中时,它往往会优先于其他第三方解决方案而被产品选中。通过向公众开放至少一年,模块需要通过社区确立自己为解决模块预期解决的问题的最佳选择(之一)。
模块的开发必须移入 Python 的基础设施(即,该模块不再直接在 Python 之外维护)。这可以防止包含在 stdlib 中的代码与在 stdlib 之外发布的代码(通常是为了向较旧版本的 Python 提供模块)之间的分歧。它还消除了迫使核心开发人员将错误报告或补丁重定向到外部问题跟踪器和VCS的负担。
参与模块开发的人员必须承诺在两年内帮助维护 stdlib 中的模块。这不仅通过减轻包含该模块的第一个 Python 版本中收到的错误报告的工作量来帮助其他核心开发人员,而且还有助于确保模块的整体设计保持一致。
提案流程¶
如果您要提议添加到 stdlib 的模块满足要求,则可以通过遵循PEP流程来提议将其包含在内。有关详细信息,请参阅PEP 1,有关先前接受的提议将模块包含在内的 PEP,请参阅PEP 索引。
如果 PEP 被接受,那么一旦模块的作者签署贡献者协议,该模块将被添加到 stdlib 中。
添加新环境变量¶
环境变量的名称应大写,从 Python 3.13 开始,为了可读性和可访问性,应使用下划线。
例如,使用 PYTHON_CPU_COUNT
而不是 PYTHONCPUCOUNT
。
另请参阅