PEP 1 – PEP 目的和指南
- 作者:
- Barry Warsaw、Jeremy Hylton、David Goodger、Alyssa Coghlan
- 状态:
- 活跃
- 类型:
- 流程
- 创建:
- 2000年6月13日
- 修订历史:
- 2001年3月21日、2002年7月29日、2003年5月3日、2012年5月5日、2013年4月7日
什么是 PEP?
PEP 代表 Python 增强提案。PEP 是一种设计文档,用于向 Python 社区提供信息,或描述 Python 或其流程或环境的新功能。PEP 应提供该功能的简洁技术规范以及该功能的基本原理。
我们希望 PEP 成为提出主要新功能、收集社区对某个问题的意见以及记录 Python 设计决策的主要机制。PEP 作者负责在社区内达成共识并记录不同意见。
由于 PEP 作为文本文件保存在版本控制的存储库中,因此它们的修订历史记录了功能提案的历史记录。可以通过正常的 git 命令检索旧版本来访问此历史记录,也可以在 GitHub 上浏览。
PEP 读者对象
PEP 的典型主要读者对象是 CPython 参考解释器的核心开发者及其选出的掌舵委员会,以及 Python 语言规范的其他实现的开发者。
但是,Python 社区的其他部分也可以选择使用此流程(特别是对于信息性 PEP),以记录预期的 API 约定并管理需要跨多个项目协作的复杂设计协调问题。
PEP 类型
PEP 有三种类型
- 标准跟踪 PEP 描述了 Python 的新功能或实现。它还可以描述将在标准库之外支持的互操作性标准,用于当前 Python 版本,然后在后续 PEP 在未来版本中添加标准库支持。
- 信息性 PEP 描述了 Python 设计问题,或向 Python 社区提供一般指南或信息,但不建议使用新功能。信息性 PEP 不一定代表 Python 社区的共识或建议,因此用户和实施者可以自由地忽略信息性 PEP 或遵循其建议。
- 流程 PEP 描述了围绕 Python 的流程,或建议更改流程(或流程中的事件)。流程 PEP 类似于标准跟踪 PEP,但适用于 Python 语言本身以外的领域。它们可能会提出实现,但不是针对 Python 的代码库;它们通常需要社区共识;与信息性 PEP 不同,它们不仅仅是建议,用户通常不能自由地忽略它们。示例包括程序、指南、决策流程的更改以及 Python 开发中使用的工具或环境的更改。任何元 PEP 也被视为流程 PEP。
PEP 工作流程
Python 掌舵委员会
此 PEP 中有几个引用指向“掌舵委员会”或“委员会”。这指的是 PEP 13 中描述的当前当选掌舵委员会成员,他们在决定是否接受或拒绝 PEP 方面拥有最终权威。
Python 核心开发者
此 PEP 中有几个引用指向“核心开发者”。这指的是 PEP 13 中描述的当前活跃的 Python 核心团队成员。
Python 的 BDFL
此 PEP 的早期版本使用“BDFL 代表”作为 PEP 决策者的名称。这是对 Python 以前治理模型的历史参考,在该模型中,所有设计权限最终都来自 Guido van Rossum,他是 Python 编程语言的最初创建者。相比之下,掌舵委员会的设计权限源于他们由当前活跃的核心开发者选举产生。现在,PEP 代表用于代替 BDFL 代表。
PEP 编辑
PEP 编辑负责管理 PEP 工作流程的管理和编辑方面(例如,分配 PEP 编号和更改其状态)。有关详细信息,请参阅 PEP 编辑责任与工作流程。
PEP 编辑职位由当前编辑邀请,可以通过在 GitHub 上提及 @python/pep-editors
与他们联系。所有 PEP 工作流程都可以在 GitHub PEP 存储库 的问题和拉取请求中进行。
从一个 Python 想法开始
PEP 流程始于一个新的 Python 想法。强烈建议单个 PEP 包含一个关键提案或新想法;PEP 越专注,就越容易成功。大多数增强和错误修复不需要 PEP,可以直接提交到 Python 问题跟踪器。如果 PEP 提议看起来过于不集中或过于广泛,PEP 编辑保留拒绝的权利。如有疑问,请将您的 PEP 分割成几个重点突出的 PEP。
每个 PEP 必须有一个负责人 – 负责使用下面描述的样式和格式编写 PEP,在适当的论坛中引导讨论,并尝试围绕该想法建立社区共识的人。PEP 负责人(又称作者)应首先尝试确定该想法是否适合作为 PEP。发布到 Python Discourse 的想法类别 通常是最好的方法,除非更专业的场所更合适,例如 类型类别(对于静态类型想法)或 打包类别(对于打包想法)。
在着手编写 PEP 之前公开审查想法是为了节省潜在作者的时间。许多关于更改 Python 的想法被提出,但由于各种原因而被拒绝。首先询问 Python 社区某个想法是否原创有助于防止在某些注定会被拒绝的事情上花费太多时间(搜索互联网并不总是有效)。它还有助于确保该想法适用于整个社区,而不仅仅是作者。仅仅因为某个想法对作者听起来不错并不意味着它适用于大多数人在 Python 使用的大多数领域。
一旦负责人询问 Python 社区某个想法是否有被接受的可能性,则应在上面提到的适当场所中展示 PEP 草稿。这使作者有机会充实 PEP 草稿,使其格式正确、质量高,并解决对该提案的最初疑虑。
提交 PEP
在上述初步讨论之后,工作流程会根据 PEP 的任何合著者是否为核心开发者而有所不同。如果 PEP 的一个或多个合著者是核心开发者,则他们有责任遵循下面概述的流程。否则(即,没有合著者是核心开发者),则 PEP 作者需要为 PEP 寻找赞助者。
理想情况下,会确定核心开发者赞助者,但也可以在掌舵委员会批准的情况下选择非核心赞助者。GitHub“PEP 编辑”团队的成员和类型委员会的成员(PEP 729)预先获准成为赞助者。赞助者的工作是为 PEP 作者提供指导,帮助他们完成 PEP 流程的物流工作(有点像导师)。成为赞助者并不会使该人日后无法成为合著者或 PEP 代表(但不能两者兼得)。PEP 的赞助者记录在标题的“赞助者:”字段中。
一旦赞助者或与 PEP 合作的核心开发者认为 PEP 已准备好提交,则应通过 GitHub 拉取请求 提交该提案作为 PEP 草稿。草稿必须以下面描述的 PEP 样式编写,否则将立即失败审查(尽管编辑可能会更正小错误)。
标准 PEP 工作流程如下:
- 您(PEP 作者)分叉 PEP 存储库,并创建一个名为
pep-NNNN.rst
的文件,其中包含您的新 PEP。NNNN
应该是下一个可用的 PEP 编号,未被已发布或正在 PR 中的 PEP 使用。 - 在“PEP:”标题字段中,输入与您的文件名匹配的 PEP 编号作为您的 PEP 草稿编号。
- 在“类型:”标题字段中,输入“标准跟踪”、“信息性”或“流程”(视情况而定),并在“状态:”字段中输入“草稿”。有关完整详细信息,请参阅 PEP 标题前缀。
- 更新 .github/CODEOWNERS,以便列出对 PEP 存储库 具有写入访问权限的任何合著者或赞助者。这确保了将来更改该文件的任何拉取请求都将分配给他们。
- 将其推送到您的 GitHub 分支并提交拉取请求。
- PEP 编辑会审查您的 PR 的结构、格式和其他错误。对于 reST 格式的 PEP,PEP 12 提供了一个模板。它还提供了 PEP 中使用的 reST 标记的完整介绍。批准标准为:
- 它完整且合理。这些想法必须在技术上合理。编辑不考虑它们是否可能被接受。
- 标题准确描述了内容。
- PEP 的语言(拼写、语法、句子结构等)和代码风格(示例应符合 PEP 7 和 PEP 8)应正确且符合规范。提交拉取请求时,将自动检查 PEP 文本的 reStructuredText 格式是否正确。reST 标记无效的 PEP 不会被批准。
编辑通常对这项初步审查相当宽松,预计问题将在审查过程中得到纠正。注意:PEP 获得批准并不保证没有令人尴尬的错误!正确性是作者和审阅者的责任,而不是编辑的责任。
如果 PEP 尚未准备好批准,编辑将将其退回给作者进行修改,并给出具体说明。
- 批准后,他们会为您的 PEP 分配一个编号。
审查过程完成后,PEP 编辑批准它(请注意,这不等同于接受您的 PEP!),他们会将您的拉取请求合并到主分支。
PEP 编辑不会无理拒绝发布 PEP。拒绝 PEP 状态的原因包括工作重复、技术上不健全、没有提供适当的动机或解决向后兼容性问题,或者不符合 Python 哲学。在批准阶段可以咨询指导委员会,他们是草案是否适合成为 PEP 的最终仲裁者。
拥有 PEP 存储库写访问权限的开发者可以通过创建并提交新的 PEP 来直接声明 PEP 编号。这样做时,开发者必须处理 PEP 编辑通常会处理的任务(参见PEP 编辑职责和工作流程)。这包括确保初始版本符合提交 PEP 的预期标准。或者,即使是开发者也应该通过拉取请求提交 PEP。这样做时,通常期望您自己处理流程;如果您需要 PEP 编辑的帮助,请在 GitHub 上提及@python/pep-editors
。
随着更新的必要性,PEP 作者可以在他们(或合作开发者)拥有 PEP 存储库写访问权限的情况下签入新版本。尽早分配 PEP 编号对于方便参考很有用,尤其是在同时考虑多个 PEP 草案时。
标准轨迹 PEP 由两部分组成:设计文档和参考实现。通常建议至少与 PEP 共同开发原型实现,因为从原则上讲听起来不错的主意,在经受实现检验时有时会发现不切实际。
讨论 PEP
一旦分配了 PEP 编号并将 PEP 草案提交到 PEP 存储库中,就应该为 PEP 创建一个讨论线程,以提供一个集中讨论和审查其内容的地方,并且应该更新 PEP,以便Discussions-To
标题链接到它。
PEP 作者(或赞助商,如果适用)可以选择任何合理的场所进行讨论,只要满足以下条件即可
- 论坛适合 PEP 的主题。
- 该线程在网络上公开可用,以便所有相关方都可以参与。
- 讨论须遵守Python 社区行为准则。
- PEP 中的
Discussions-To
标题下提供了指向当前讨论线程的直接链接。
对于大多数新的 PEP 来说,Python Discourse 的 PEP 类别是首选,而历史上常用的则是Python-Dev 邮件列表。一些专门的主题有特定的场所,例如 Python Discourse 上的类型类别和打包类别分别用于类型和打包 PEP。如果 PEP 作者不确定最佳场所,PEP 赞助商和 PEP 编辑可以相应地为他们提供建议。
如果 PEP 进行了重大的重写或对其提议的规范进行了其他重大、实质性的更改,则通常应在选定的场所创建一个新线程以征求其他反馈。如果发生这种情况,则必须更新Discussions-To
链接,并添加一个新的Post-History
条目指向此新线程。
如果未将其选为讨论场所,则应在PEP 类别中发布简短的公告帖子,至少包含指向已渲染 PEP 的链接以及Discussions-To
线程的链接(当 PEP 草案提交到存储库中时,以及如果进行了重大更改以触发新线程时)。
PEP 作者有责任在提交 PEP 以供审查之前收集社区反馈。但是,为了避免冗长且开放式的讨论,应考虑一些策略,例如在早期设计阶段征求私人或更具针对性的反馈、与具有 PEP 主题专业知识的其他社区成员合作,以及为 PEP 的主题选择一个适当的专业化讨论(如果适用)。PEP 作者应在此处谨慎行事。
一旦 PEP 被分配了一个编号并提交到 PEP 存储库,实质性问题通常应在规范的公共线程上进行讨论,而不是私有渠道、GitHub 拉取请求审查或无关的场所。这确保每个人都可以关注和贡献,避免讨论碎片化,并确保它作为 PEP 审查过程的一部分得到充分考虑。指导委员会或 PEP 代表在审查 PEP 时,将把对此指定线程的评论、支持、关注和其他反馈作为重要组成部分。
PEP 审查与决议
一旦作者完成了 PEP,他们可以请求 PEP 编辑审查其风格和一致性。但是,PEP 的内容审查和接受最终由指导委员会负责,这由在作者(以及赞助商,如果有)确定 PEP 已准备好进行最终审查和决议时打开指导委员会问题正式启动。
为了在选定的情况下加快流程(例如,当更改明显有益且已准备好接受,但 PEP 尚未正式提交审查时),指导委员会也可以启动 PEP 审查,首先通知 PEP 作者并给他们机会进行修订。
PEP 批准的最终权限是指导委员会。但是,每当提出新的 PEP 时,任何认为自己有足够经验做出该 PEP 最终决定的核心开发者都可以通过通知指导委员会他们意图来提议担任其 PEP 代表。如果指导委员会批准他们的提议,则 PEP 代表将有权批准或拒绝该 PEP。对于与 Python 类型系统相关的 PEP,类型委员会(PEP 729)向指导委员会提供建议。要请求此类建议,请在类型委员会问题跟踪器上打开一个问题。
术语“PEP 代表”是在指导委员会治理模型下使用的,用于 PEP 的指定决策者,该决策者记录在 PEP 标题中的“PEP 代表”字段中。术语“BDFL 代表”是 PEP 代表的已弃用别名,是 Python 由BDFL领导时的遗留产物。任何对“BDFL 代表”的遗留引用都应视为等同于“PEP 代表”。
提议自己担任 PEP 代表的个人必须通知相关作者以及(如果存在)PEP 的赞助商,并将他们的请求提交给指导委员会(可以通过新的问题完成)。承担此责任的人员可以随时寻求指导委员会的额外指导,并且还应考虑其他核心开发者的建议和观点。
指导委员会通常会默认批准此类自我提名,但可以选择拒绝它们。指导委员会拒绝作为 PEP 代表的自我提名的可能原因包括但不限于,对潜在利益冲突的看法(例如,与 PEP 提交者在同一组织工作),或者仅仅认为其他潜在的 PEP 代表更合适。如果核心开发者(或其他社区成员)对任何给定 PEP 的 PEP 代表的合适性有任何疑虑,他们可以要求指导委员会审查委托。
如果没有志愿者站出来,则指导委员会将与具有相关专业知识的核心开发者(以及可能的其他 Python 社区成员)联系,试图确定一位愿意担任该 PEP 的 PEP 代表的候选人。如果找不到合适的候选人,则该 PEP 将标记为延迟,直到找到候选人为止。
先前任命的 PEP 代表可以选择辞职,或者被委员会要求辞职,在这种情况下,将以与新 PEP 相同的方式任命新的 PEP 代表(包括如果找不到合适的替代者则延迟 PEP)。如果要求 PEP 代表辞职,这将否决 PEP 之前任何接受或拒绝,并且它将恢复到草稿状态。
当建立此类常设委托时,指导委员会将维护足够的公开记录,以使后续委员会、核心开发者和更广泛的 Python 社区能够了解当前存在的委托、建立这些委托的原因以及它们可能不再需要的具体情况。
为了使 PEP 被接受,它必须满足某些最低标准。它必须是对提议的增强功能的清晰而完整的描述。增强功能必须代表净改进。如果适用,提议的实现必须是可靠的,并且不得过多地使解释器复杂化。最后,提议的增强功能必须是“pythonic”才能被指导委员会接受。(但是,“pythonic”是一个不精确的术语;它可以定义为指导委员会可接受的任何内容。此逻辑是有意循环的。)有关标准库模块接受标准,请参阅PEP 2。
除非指导委员会另有批准,否则 PEP 决议的公告将发布到Python Discourse 上的 PEP 类别。
PEP 被接受后,必须完成参考实现。当参考实现完成并合并到主源代码存储库中时,状态将更改为“最终”。
为了在承诺语言特性或标准库 API 的长期稳定性之前收集额外的设计和接口反馈,PEP 也可以标记为“临时”。这是“临时接受”的简称,表示该提议已被接受纳入参考实现,但在将完整设计视为“最终”之前需要额外的用户反馈。与常规接受的 PEP 不同,即使在相关更改已包含在 Python 版本中之后,临时接受的 PEP 仍可能被拒绝或撤回。
在可能的情况下,建议缩小提案的范围,以避免依赖“临时”(Provisional)状态(例如,将某些功能推迟到以后的 PEP 中),因为这种状态可能导致更广泛的 Python 生态系统中出现版本兼容性问题。PEP 411 提供了有关临时状态潜在用例的更多详细信息。
PEP 也可以被分配“延迟”(Deferred)状态。当 PEP 没有取得进展时,PEP 作者或编辑可以将 PEP 分配此状态。一旦 PEP 被延迟,PEP 编辑可以将其重新分配为草稿状态。
PEP 也可以被“拒绝”(Rejected)。也许在一切都说完之后,它不是一个好主意。记录这一事实仍然很重要。“撤回”(Withdrawn)状态与此类似——这意味着 PEP 作者自己决定 PEP 实际上是一个坏主意,或者已经接受了一个竞争性提案是一个更好的替代方案。
当 PEP 被接受、拒绝或撤回时,应相应地更新 PEP。除了更新“状态”字段外,至少应添加“决议”标题,并提供指向相关决策帖子的直接链接。
PEP 也可以被另一个 PEP 取代,从而使原始 PEP 变得过时。这适用于信息性 PEP,其中 API 的版本 2 可以替换版本 1。
PEP 状态的可能路径如下所示
虽然图中没有显示,“接受”(Accepted)的 PEP 在接受后也可能在技术上转移到“拒绝”或“撤回”状态。这仅在实施过程中发现设计中存在先前未注意到的根本缺陷时才会发生。与临时 PEP 不同,这些转换仅在已接受的提案未包含在 Python 版本中时才允许——已发布的更改必须改为通过常规弃用流程(这可能需要一个新的 PEP 来提供弃用的理由)。
某些信息性 PEP 和流程 PEP 也可能具有“活跃”(Active)状态,如果它们从未打算完成。例如,PEP 1(本 PEP)。
PEP 维护
通常,PEP 在达到“接受”、“最终”、“拒绝”或“取代”状态后,将不再进行实质性修改。一旦达成决议,PEP 将被视为历史文档,而不是动态规范。预期行为的正式文档应在其他地方维护,例如核心功能的语言参考,标准库模块的库参考或打包的PyPA 规范。
如果在临时状态或(经 SC 批准)接受状态下,对标准跟踪 PEP 进行基于实施经验和用户反馈的更改,则应在 PEP 中进行记录,以便 PEP 在标记为最终时准确描述实现。
活跃(信息性和流程)PEP 可能会随着时间的推移而更新,以反映开发实践和其他细节的变化。在这些情况下遵循的具体流程将取决于所讨论的 PEP 的性质和目的。
偶尔,延迟的 PEP 甚至撤回的 PEP 可能会在进行重大更新后复活,但通常最好只是提出一个新的 PEP。
成功的 PEP 中应该包含什么?
每个 PEP 应包含以下部分/章节
- 前言 - RFC 2822 样式标题,包含有关 PEP 的元数据,包括 PEP 编号、简短的描述性标题(限制在最多 44 个字符)、每个作者的姓名以及可选的联系信息等。
- 摘要 - 对正在解决的技术问题的简短(约 200 字)描述。
- 动机 - 动机对于想要更改 Python 语言、库或生态系统的 PEP 至关重要。它应该清楚地解释为什么现有的语言规范不足以解决 PEP 解决的问题。这可能包括从 Python 生态系统中的重要项目收集对 PEP 的记录支持。没有充分动机的 PEP 提交可能会被拒绝。
- 基本原理 - 基本原理通过描述做出特定设计决策的原因来充实规范。它应该描述考虑过的替代设计和相关工作,例如,其他语言如何支持该功能。
基本原理应提供社区内共识的证据,并讨论在讨论期间提出的重要异议或担忧。
- 规范 - 技术规范应描述任何新语言功能的语法和语义。规范应该足够详细,以便至少允许当前主要 Python 平台(CPython、Jython、IronPython、PyPy)的互操作实现。
- 向后兼容性 - 所有引入向后不兼容性的 PEP 必须包含一个描述这些不兼容性及其严重性的部分。PEP 必须解释作者如何提议处理这些不兼容性。没有充分的向后兼容性论述的 PEP 提交可能会被直接拒绝。
- 安全影响 - 如果与 PEP 相关存在安全问题,则应明确写出这些问题,以确保 PEP 的审阅者了解这些问题。
- 如何教授 - 对于添加新功能或更改语言行为的 PEP,在如何教授新老用户如何将其应用于他们的工作方面,包含一个部分会很有帮助。
此部分可能包括关键要点和建议的文档更改,这些更改将帮助用户采用新功能或迁移其代码以使用语言更改。
- 参考实现 - 在任何 PEP 获得“最终”状态之前,必须完成参考实现,但不必在 PEP 被接受之前完成。虽然在编写代码之前就规范和基本原理达成共识的方法很有价值,但在解决许多 API 细节讨论时,“粗略共识和运行代码”的原则仍然有用。
最终实现必须包括测试代码和文档,这些代码和文档适用于 Python 语言参考或标准库参考。
- 被拒绝的想法 - 在整个 PEP 的讨论过程中,将提出各种未被接受的想法。这些被拒绝的想法应与拒绝其的原因一起记录下来。这既有助于记录 PEP 最终版本背后的思考过程,也防止人们在后续讨论中再次提出相同被拒绝的想法。
从某种意义上说,此部分可以被认为是基本原理部分的一个分支部分,专门针对为什么最终没有追求某些想法。
- 未解决的问题 - 当 PEP 处于草稿阶段时,可能会出现需要进一步讨论的想法。这些想法应该被记录下来,以便人们知道他们正在考虑这些想法,但没有具体的解决方案。这有助于确保 PEP 准备好供考虑的所有问题都已完成,并减少人们重复先前的讨论。
- 脚注 - PEP 中引用的脚注的集合,以及列出非内联超链接目标的地方。
- 版权/许可 - 每个新的 PEP 必须放在公共领域和CC0-1.0-Universal 的双重许可下(请参阅此 PEP 以获取示例)。
PEP 格式和模板
PEP 是使用reStructuredText 格式的 UTF-8 编码文本文件。reStructuredText 允许使用仍然非常易于阅读的丰富标记,但也生成美观且功能强大的 HTML。PEP 12 包含说明和PEP 模板。
PEP 标题前缀
每个 PEP 必须以RFC 2822 样式标题前言开头。标题必须按以下顺序出现。标有“*”的标题是可选的,并在下面进行了描述。所有其他标题都是必需的。
PEP: <pep number>
Title: <pep title>
Author: <list of authors' real names and optionally, email addrs>
* Sponsor: <real name of sponsor>
* PEP-Delegate: <PEP delegate's real name>
Discussions-To: <URL of current canonical discussion thread>
Status: <Draft | Active | Accepted | Provisional | Deferred | Rejected |
Withdrawn | Final | Superseded>
Type: <Standards Track | Informational | Process>
* Topic: <Governance | Packaging | Release | Typing>
* Requires: <pep numbers>
Created: <date created on, in dd-mmm-yyyy format>
* Python-Version: <version number>
Post-History: <dates, in dd-mmm-yyyy format,
inline-linked to PEP discussion threads>
* Replaces: <pep number>
* Superseded-By: <pep number>
* Resolution: <url>
“作者”标题列出了 PEP 的所有作者/所有者的姓名以及可选的电子邮件地址。“作者”标题值的格式必须为
Random J. User <random@example.com>
如果包含电子邮件地址,则仅为
Random J. User
如果未提供地址。
如果有多个作者,则每个作者都应位于遵循RFC 2822 续行约定的单独一行上。请注意,PEP 中的个人电子邮件地址将被模糊处理,以防垃圾邮件收集器。
“赞助商”字段记录哪个开发人员(核心开发人员或经指导委员会批准的开发人员)赞助了 PEP。如果 PEP 的作者之一是核心开发人员,则不需要赞助商,因此应省略此字段。
“PEP 代表”字段用于记录指导委员会指定的人员,以最终决定是否批准或拒绝 PEP。
注意:只有标准跟踪 PEP 要求“决议”标题。它包含一个 URL,该 URL 应指向电子邮件或其他网络资源,其中包含有关 PEP 的公告(即批准或拒绝)。
“讨论地址”标题提供 PEP 当前规范讨论主题的 URL。对于电子邮件列表,这应为列表存档中线程的直接链接,而不仅仅是 mailto: 或指向列表本身的超链接。
“类型”标题指定 PEP 的类型:标准跟踪、信息性或流程。
可选的“主题”标题列出 PEP 属于的任何特殊主题。有关现有主题,请参阅主题索引。
“创建”标题记录 PEP 被分配编号的日期,而“发布历史”用于记录 PEP 的讨论地址线程的日期和相应的 URL,前者作为链接文本,后者作为链接目标。两组日期都应采用dd-mmm-yyyy
格式,例如14-Aug-2001
。
标准跟踪 PEP 通常具有“Python 版本”标题,该标题指示将发布该功能的 Python 版本。没有“Python 版本”标题的标准跟踪 PEP 指示最初将通过外部库和工具支持的互操作性标准,然后可能由以后的 PEP 补充以向标准库添加支持。信息性和流程 PEP 不需要“Python 版本”标题。
PEP 可能具有“需求”标题,指示此 PEP 依赖的 PEP 编号。
PEP 可能还会包含一个“Superseded-By”头部,表明该 PEP 已被后续文档取代;其值为取代当前文档的 PEP 编号。较新的 PEP 必须包含一个“Replaces”头部,其中包含其所取代的 PEP 编号。
辅助文件
PEP 可能包含辅助文件,例如图表。这些文件应命名为 pep-XXXX-Y.ext
,其中“XXXX”是 PEP 编号,“Y”是序列号(从 1 开始),而“ext”则替换为实际的文件扩展名(例如“png”)。
或者,所有支持文件都可以放在名为 pep-XXXX
的子目录中,其中“XXXX”是 PEP 编号。使用子目录时,对文件中使用的名称没有限制。
修改现有 PEP
草案 PEP 在提交给指导委员会或 PEP 代表审查和决议之前,作者可以自由地讨论和提出修改建议。实质性内容更改通常应首先在 PEP 的讨论线程中提出,该讨论线程列在其 Discussions-To
头部中,而校对和更正可以作为 GitHub issue 或 GitHub pull request 提交。拥有 PEP 存储库写入权限的 PEP 作者可以通过使用 git push
或 GitHub PR 来更新 PEP 本身,以提交他们的更改。有关修改其他 PEP 的指南,请参阅 PEP 维护 部分。
有关更多详细信息,请参阅 贡献指南,如有疑问,请先咨询 PEP 作者和/或 PEP 编辑。
转移 PEP 所有权
有时需要将 PEP 的所有权转移给新的负责人。一般来说,最好保留原作者作为转移 PEP 的共同作者,但这实际上取决于原作者。转移所有权的一个好理由是,原作者不再有时间或兴趣更新它或遵循 PEP 流程,或者已经消失在网络上(即无法联系或没有回复电子邮件)。转移所有权的一个坏理由是,作者不同意 PEP 的方向。PEP 流程的一个目标是尝试围绕 PEP 建立共识,但如果这不可能,作者始终可以提交一个竞争性的 PEP。
如果您有兴趣承担 PEP 的所有权,您也可以通过拉取请求来完成此操作。分叉 PEP 存储库,进行所有权修改,然后提交拉取请求。您应该在拉取请求的评论中提及原作者和 @python/pep-editors
。(如果原作者的 GitHub 用户名未知,请使用电子邮件。)如果原作者没有及时回复,PEP 编辑将做出单方面决定(并非此类决定无法撤销 :))。
PEP 编辑责任与工作流程
必须将 PEP 编辑添加到 GitHub 上的 @python/pep-editors
组中,并且必须监视 PEP 存储库。
请注意,拥有 PEP 存储库 写入权限的开发人员可以处理通常由 PEP 编辑处理的任务。或者,即使是开发人员也可以通过在 GitHub 上提及 @python/pep-editors
来请求 PEP 编辑的帮助。
对于每个新提交的 PEP,编辑都会执行以下操作
- 确保 PEP 具有核心开发人员的共同作者身份,或由核心开发人员担任赞助人,或者由指导委员会专门批准的赞助人赞助此 PEP。
- 阅读 PEP 以检查其是否已准备好:完整且合理。即使这些想法看起来不太可能被接受,也必须在技术上合理。
- 标题应准确描述内容。
- 文件名扩展名正确(即
.rst
)。 - 确保 PEP 中列出的所有赞助商或共同作者,并且拥有 PEP 存储库 写入权限的用户都已添加到 .github/CODEOWNERS 中。
- 略读 PEP,查找语言方面(拼写、语法、句子结构等)和代码风格方面(示例应符合 PEP 7 和 PEP 8)的明显缺陷。编辑可以自行更正问题,但没有义务这样做(存储库的 CI 会检查 reStructuredText 语法)。
- 如果某个项目被描绘成受益于或支持 PEP,请确保包含来自该项目的某些直接指示,以明确其支持。这样做是为了避免 PEP 意外地将某个项目描绘成支持 PEP,而实际上这种支持是基于推测的。
如果 PEP 未准备好,编辑将将其退回给作者进行修订,并提供具体说明。如果 reST 格式存在问题,请要求作者使用 PEP 12 作为模板并重新提交。
一旦 PEP 准备好进入存储库,PEP 编辑将
- 检查作者是否选择了有效的 PEP 编号,或者如果他们尚未选择,则为其分配一个编号(几乎总是下一个可用编号,但有时它是一个特殊/玩笑编号,例如 666 或 3141)。
请记住,100 以下的编号是元 PEP。
- 检查作者是否已正确标记 PEP 的类型(“标准跟踪”、“信息性”或“流程”),并将其状态标记为“草案”。
- 确保所有 CI 构建和 lint 检查都通过且没有错误,并且渲染的预览输出中没有明显的问题。
- 合并新的(或更新的)PEP。
- 告知作者后续步骤(打开讨论线程并用它更新 PEP,发布公告等)。
现有 PEP 的更新应作为 GitHub pull request 提交。
许多 PEP 由拥有 Python 代码库写入权限的开发人员编写和维护。PEP 编辑监视 PEP 存储库中的更改,并更正他们看到的任何结构、语法、拼写或标记错误。
PEP 编辑不会对 PEP 进行评判。他们只是执行管理和编辑工作(这通常是一项工作量较小的任务)。
资源
版权
本文件置于公共领域或根据 CC0-1.0-Universal 许可证发布,以两者中许可范围更宽者为准。
来源:https://github.com/python/peps/blob/main/peps/pep-0001.rst
上次修改时间:2024-01-12 20:31:04 GMT