874 lines
39 KiB
ReStructuredText
874 lines
39 KiB
ReStructuredText
PEP: 1
|
|
Title: PEP Purpose and Guidelines
|
|
Author: Barry Warsaw, Jeremy Hylton, David Goodger, Alyssa Coghlan
|
|
Status: Active
|
|
Type: Process
|
|
Created: 13-Jun-2000
|
|
Post-History: 21-Mar-2001, 29-Jul-2002, 03-May-2003, 05-May-2012,
|
|
07-Apr-2013
|
|
|
|
|
|
What is a PEP?
|
|
==============
|
|
|
|
PEP stands for Python Enhancement Proposal. A PEP is a design
|
|
document providing information to the Python community, or describing
|
|
a new feature for Python or its processes or environment. The PEP
|
|
should provide a concise technical specification of the feature and a
|
|
rationale for the feature.
|
|
|
|
We intend PEPs to be the primary mechanisms for proposing major new
|
|
features, for collecting community input on an issue, and for
|
|
documenting the design decisions that have gone into Python. The PEP
|
|
author is responsible for building consensus within the community and
|
|
documenting dissenting opinions.
|
|
|
|
Because the PEPs are maintained as text files in a versioned
|
|
repository, their revision history is the historical record of the
|
|
feature proposal. This historical record is available by the normal git
|
|
commands for retrieving older revisions, and can also be browsed
|
|
`on GitHub <https://github.com/python/peps>`__.
|
|
|
|
|
|
PEP Audience
|
|
============
|
|
|
|
The typical primary audience for PEPs are the core developers of the CPython
|
|
reference interpreter and their elected Steering Council, as well as developers
|
|
of other implementations of the Python language specification.
|
|
|
|
However, other parts of the Python community may also choose to use the process
|
|
(particularly for Informational PEPs) to document expected API conventions and
|
|
to manage complex design coordination problems that require collaboration across
|
|
multiple projects.
|
|
|
|
|
|
PEP Types
|
|
=========
|
|
|
|
There are three kinds of PEP:
|
|
|
|
1. A **Standards Track** PEP describes a new feature or implementation
|
|
for Python. It may also describe an interoperability standard that will
|
|
be supported outside the standard library for current Python versions
|
|
before a subsequent PEP adds standard library support in a future
|
|
version.
|
|
|
|
2. An **Informational** PEP describes a Python design issue, or
|
|
provides general guidelines or information to the Python community,
|
|
but does not propose a new feature. Informational PEPs do not
|
|
necessarily represent a Python community consensus or
|
|
recommendation, so users and implementers are free to ignore
|
|
Informational PEPs or follow their advice.
|
|
|
|
3. A **Process** PEP describes a process surrounding Python, or
|
|
proposes a change to (or an event in) a process. Process PEPs are
|
|
like Standards Track PEPs but apply to areas other than the Python
|
|
language itself. They may propose an implementation, but not to
|
|
Python's codebase; they often require community consensus; unlike
|
|
Informational PEPs, they are more than recommendations, and users
|
|
are typically not free to ignore them. Examples include
|
|
procedures, guidelines, changes to the decision-making process, and
|
|
changes to the tools or environment used in Python development.
|
|
Any meta-PEP is also considered a Process PEP.
|
|
|
|
|
|
PEP Workflow
|
|
============
|
|
|
|
Python's Steering Council
|
|
-------------------------
|
|
|
|
There are several references in this PEP to the "Steering Council" or "Council".
|
|
This refers to the current members of the elected Steering Council described
|
|
in :pep:`13`, in their role as the final authorities on whether or not PEPs
|
|
will be accepted or rejected.
|
|
|
|
|
|
Python's Core Developers
|
|
------------------------
|
|
|
|
There are several references in this PEP to "core developers". This refers to
|
|
the currently active Python core team members described in :pep:`13`.
|
|
|
|
|
|
Python's BDFL
|
|
-------------
|
|
|
|
Previous versions of this PEP used the title "BDFL-Delegate" for PEP decision
|
|
makers. This was a historical reference to Python's previous governance model,
|
|
where all design authority ultimately derived from Guido van Rossum, the
|
|
original creator of the Python programming language. By contrast, the Steering
|
|
Council's design authority derives from their election by the currently active
|
|
core developers. Now, PEP-Delegate is used in place of BDFL-Delegate.
|
|
|
|
|
|
PEP Editors
|
|
-----------
|
|
|
|
The PEP editors are individuals responsible for managing the administrative
|
|
and editorial aspects of the PEP workflow (e.g. assigning PEP numbers and
|
|
changing their status). See `PEP Editor Responsibilities & Workflow`_ for
|
|
details.
|
|
|
|
PEP editorship is by invitation of the current editors, and they can be
|
|
contacted by mentioning ``@python/pep-editors`` on GitHub. All of the PEP
|
|
workflow can be conducted via the GitHub `PEP repository`_ issues and pull
|
|
requests.
|
|
|
|
|
|
Start with an idea for Python
|
|
-----------------------------
|
|
|
|
The PEP process begins with a new idea for Python. It is highly
|
|
recommended that a single PEP contain a single key proposal or new
|
|
idea; the more focused the PEP, the more successful it tends to be.
|
|
Most enhancements and bug fixes don't need a PEP and
|
|
can be submitted directly to the `Python issue tracker`_.
|
|
The PEP editors reserve the
|
|
right to reject PEP proposals if they appear too unfocused or too
|
|
broad. If in doubt, split your PEP into several well-focused ones.
|
|
|
|
Each PEP must have a champion -- someone who writes the PEP using the style
|
|
and format described below, shepherds the discussions in the appropriate
|
|
forums, and attempts to build community consensus around the idea. The PEP
|
|
champion (a.k.a. Author) should first attempt to ascertain whether the idea is
|
|
PEP-able. Posting to the `Ideas category`_ of the `Python Discourse`_ is usually
|
|
the best way to go about this, unless a more specialized venue is appropriate,
|
|
such as the `Typing category`_ (for static typing ideas)
|
|
or `Packaging category`_ (for packaging ideas) on the Python Discourse.
|
|
|
|
Vetting an idea publicly before going as far as writing a PEP is meant
|
|
to save the potential author time. Many ideas have been brought
|
|
forward for changing Python that have been rejected for various
|
|
reasons. Asking the Python community first if an idea is original
|
|
helps prevent too much time being spent on something that is
|
|
guaranteed to be rejected based on prior discussions (searching
|
|
the internet does not always do the trick). It also helps to make sure
|
|
the idea is applicable to the entire community and not just the author.
|
|
Just because an idea sounds good to the author does not
|
|
mean it will work for most people in most areas where Python is used.
|
|
|
|
Once the champion has asked the Python community as to whether an
|
|
idea has any chance of acceptance, a draft PEP should be presented to
|
|
the appropriate venue mentioned above.
|
|
This gives the author a chance to flesh out the draft
|
|
PEP to make properly formatted, of high quality, and to address
|
|
initial concerns about the proposal.
|
|
|
|
|
|
Submitting a PEP
|
|
----------------
|
|
|
|
Following the above initial discussion, the workflow varies based on whether
|
|
any of the PEP's co-authors are core developers. If one or more of the PEP's
|
|
co-authors are core developers, they are responsible for following the process
|
|
outlined below. Otherwise (i.e. none of the co-authors are core developers),
|
|
then the PEP author(s) will need to find a sponsor for the PEP.
|
|
|
|
Ideally, a core developer sponsor is identified, but non-core sponsors may also
|
|
be selected with the approval of the Steering Council. Members of the GitHub
|
|
"PEP editors" team are pre-approved to be sponsors. The sponsor's job is to
|
|
provide guidance to the PEP author to help them through the logistics of the
|
|
PEP process (somewhat acting like a mentor). Being a sponsor does **not**
|
|
disqualify that person from becoming a co-author or PEP-Delegate later on (but
|
|
not both). The sponsor of a PEP is recorded in the "Sponsor:" field of the
|
|
header.
|
|
|
|
Once the sponsor or the core developer(s) co-authoring the PEP deem the PEP
|
|
ready for submission, the proposal should be submitted as a draft PEP via a
|
|
`GitHub pull request`_. The draft must be written in PEP style as described
|
|
below, else it will fail review immediately (although minor errors may be
|
|
corrected by the editors).
|
|
|
|
The standard PEP workflow is:
|
|
|
|
* You, the PEP author, fork the `PEP repository`_, and create a file named
|
|
:file:`pep-{NNNN}.rst` that contains your new PEP. :samp:`{NNNN}` should be the next
|
|
available PEP number not used by a published or in-PR PEP.
|
|
|
|
* In the "PEP:" header field, enter the PEP number that matches your filename
|
|
as your draft PEP number.
|
|
|
|
* In the "Type:" header field, enter "Standards Track",
|
|
"Informational", or "Process" as appropriate, and for the "Status:"
|
|
field enter "Draft". For full details, see `PEP Header Preamble`_.
|
|
|
|
* Update `.github/CODEOWNERS`_ such that any co-author(s) or sponsors
|
|
with write access to the `PEP repository`_ are listed for your new file.
|
|
This ensures any future pull requests changing the file will be assigned
|
|
to them.
|
|
|
|
* Push this to your GitHub fork and submit a pull request.
|
|
|
|
* The PEP editors review your PR for structure, formatting, and other
|
|
errors. For a reST-formatted PEP, :pep:`12` is provided as a template.
|
|
It also provides a complete introduction to reST markup that is used
|
|
in PEPs. Approval criteria are:
|
|
|
|
* It is sound and complete. The ideas must make technical sense. The
|
|
editors do not consider whether they seem likely to be accepted.
|
|
* The title accurately describes the content.
|
|
* The PEP's language (spelling, grammar, sentence structure, etc.)
|
|
and code style (examples should match :pep:`7` & :pep:`8`) should be
|
|
correct and conformant. The PEP text will be automatically checked for
|
|
correct reStructuredText formatting when the pull request is submitted.
|
|
PEPs with invalid reST markup will not be approved.
|
|
|
|
Editors are generally quite lenient about this initial review,
|
|
expecting that problems will be corrected by the reviewing process.
|
|
**Note:** Approval of the PEP is no guarantee that there are no
|
|
embarrassing mistakes! Correctness is the responsibility of authors
|
|
and reviewers, not the editors.
|
|
|
|
If the PEP isn't ready for approval, an editor will send it back to
|
|
the author for revision, with specific instructions.
|
|
|
|
* Once approved, they will assign your PEP a number.
|
|
|
|
Once the review process is complete, and the PEP editors approve it (note that
|
|
this is *not* the same as accepting your PEP!), they will squash commit your
|
|
pull request onto main.
|
|
|
|
The PEP editors will not unreasonably deny publication of a PEP. Reasons for
|
|
denying PEP status include duplication of effort, being technically unsound,
|
|
not providing proper motivation or addressing backwards compatibility, or not
|
|
in keeping with the Python philosophy. The Steering Council can be consulted
|
|
during the approval phase, and are the final arbiter of a draft's PEP-ability.
|
|
|
|
Developers with write access to the `PEP repository`_ may claim PEP
|
|
numbers directly by creating and committing a new PEP. When doing so, the
|
|
developer must handle the tasks that would normally be taken care of by the
|
|
PEP editors (see `PEP Editor Responsibilities & Workflow`_). This includes
|
|
ensuring the initial version meets the expected standards for submitting a
|
|
PEP. Alternately, even developers should submit PEPs via pull request.
|
|
When doing so, you are generally expected to handle the process yourself;
|
|
if you need assistance from PEP editors, mention ``@python/pep-editors``
|
|
on GitHub.
|
|
|
|
As updates are necessary, the PEP author can check in new versions if they
|
|
(or a collaborating developer) have write access to the `PEP repository`_.
|
|
Getting a PEP number assigned early can be useful for ease of
|
|
reference, especially when multiple draft PEPs are being considered at the
|
|
same time.
|
|
|
|
Standards Track PEPs consist of two parts, a design document and a
|
|
reference implementation. It is generally recommended that at least a
|
|
prototype implementation be co-developed with the PEP, as ideas that sound
|
|
good in principle sometimes turn out to be impractical when subjected to the
|
|
test of implementation.
|
|
|
|
|
|
Discussing a PEP
|
|
----------------
|
|
|
|
As soon as a PEP number has been assigned
|
|
and the draft PEP is committed to the `PEP repository`_,
|
|
a discussion thread for the PEP should be created
|
|
to provide a central place to discuss and review its contents, and the
|
|
PEP should be updated so that the ``Discussions-To`` header links to it.
|
|
|
|
The PEP authors (or sponsor, if applicable) may select any reasonable venue
|
|
for the discussion, so long as the the following criteria are met:
|
|
|
|
* The forum is appropriate to the PEP's topic.
|
|
* The thread is publicly available on the web so that all interested parties
|
|
can participate.
|
|
* The discussion is subject to the `Python Community Code of Conduct
|
|
<https://www.python.org/psf/conduct/>`_.
|
|
* A direct link to the current discussion thread is provided in the PEP
|
|
under the ``Discussions-To`` header.
|
|
|
|
The `PEPs category`_ of the `Python Discourse`_
|
|
is the preferred choice for most new PEPs,
|
|
whereas historically the `Python-Dev`_ mailing list was commonly used.
|
|
Some specialized topics have specific venues, such as
|
|
the `Typing category`_ and the `Packaging category`_ on the Python
|
|
Discourse for typing and packaging PEPs, respectively.
|
|
If the PEP authors are unsure of the best venue,
|
|
the PEP Sponsor and PEP editors can advise them accordingly.
|
|
|
|
If a PEP undergoes a significant re-write or other major, substantive
|
|
changes to its proposed specification, a new thread should typically be created
|
|
in the chosen venue to solicit additional feedback. If this occurs, the
|
|
``Discussions-To`` link must be updated and a new ``Post-History`` entry added
|
|
pointing to this new thread.
|
|
|
|
If it is not chosen as the discussion venue,
|
|
a brief announcement post should be made to the `PEPs category`_
|
|
with at least a link to the rendered PEP and the ``Discussions-To`` thread
|
|
when the draft PEP is committed to the repository
|
|
and if a major-enough change is made to trigger a new thread.
|
|
|
|
PEP authors are responsible for collecting community feedback on a PEP
|
|
before submitting it for review. However, to avoid long-winded and
|
|
open-ended discussions, strategies such as soliciting private or more
|
|
narrowly-tailored feedback in the early design phase,
|
|
collaborating with other community members with expertise in the PEP's
|
|
subject matter, and picking an appropriately-specialized discussion for the
|
|
PEP's topic (if applicable) should be considered.
|
|
PEP authors should use their discretion here.
|
|
|
|
Once the PEP is assigned a number and committed to the PEP repository,
|
|
substantive issues should generally be discussed on the canonical public
|
|
thread, as opposed to private channels, GitHub pull request reviews or
|
|
unrelated venues. This ensures everyone can follow and contribute,
|
|
avoids fragmenting the discussion,
|
|
and makes sure it is fully considered as part of the PEP review process.
|
|
Comments, support, concerns and other feedback on this designated thread
|
|
are a critical part of what the Steering Council or PEP-Delegate will
|
|
consider when reviewing the PEP.
|
|
|
|
|
|
PEP Review & Resolution
|
|
-----------------------
|
|
|
|
Once the authors have completed a PEP, they may request a review for
|
|
style and consistency from the PEP editors.
|
|
However, content review and acceptance of the PEP is ultimately the
|
|
responsibility of the Steering Council, which is formally initiated by
|
|
opening a `Steering Council issue`_ once the authors (and sponsor, if any)
|
|
determine the PEP is ready for final review and resolution.
|
|
|
|
To expedite the process in selected cases (e.g. when a change is clearly
|
|
beneficial and ready to be accepted, but the PEP hasn't been formally submitted
|
|
for review yet), the Steering Council may also initiate a PEP review, first
|
|
notifying the PEP author(s) and giving them a chance to make revisions.
|
|
|
|
The final authority for PEP approval is the Steering Council. However, whenever
|
|
a new PEP is put forward, any core developer who believes they are suitably
|
|
experienced to make the final decision on that PEP may offer to serve as its
|
|
PEP-Delegate by `notifying the Steering Council <Steering Council issue_>`_
|
|
of their intent. If the Steering Council approves their offer,
|
|
the PEP-Delegate will then have the authority to approve or reject that PEP.
|
|
|
|
The term "PEP-Delegate" is used under the Steering Council governance model
|
|
for the PEP's designated decision maker,
|
|
who is recorded in the "PEP-Delegate" field in the PEP's header.
|
|
The term "BDFL-Delegate" is a deprecated alias for PEP-Delegate, a legacy of
|
|
the time when when Python was led by `a BDFL <Python's BDFL_>`_.
|
|
Any legacy references to "BDFL-Delegate" should be treated as equivalent to
|
|
"PEP-Delegate".
|
|
|
|
An individual offering to nominate themselves as a PEP-Delegate must notify
|
|
the relevant authors and (when present) the sponsor for the PEP, and submit
|
|
their request to the Steering Council
|
|
(which can be done via a `new issue <Steering Council issue_>`_ ).
|
|
Those taking on this responsibility are free to seek
|
|
additional guidance from the Steering Council at any time, and are also expected
|
|
to take the advice and perspectives of other core developers into account.
|
|
|
|
The Steering Council will generally approve such self-nominations by default,
|
|
but may choose to decline them.
|
|
Possible reasons for the Steering Council declining a
|
|
self-nomination as PEP-Delegate include, but are not limited to, perceptions of
|
|
a potential conflict of interest (e.g. working for the same organisation as the
|
|
PEP submitter), or simply considering another potential PEP-Delegate to be
|
|
more appropriate. If core developers (or other community members) have concerns
|
|
regarding the suitability of a PEP-Delegate for any given PEP, they may ask
|
|
the Steering Council to review the delegation.
|
|
|
|
If no volunteer steps forward, then the Steering Council will approach core
|
|
developers (and potentially other Python community members) with relevant
|
|
expertise, in an attempt to identify a candidate that is willing to serve as
|
|
PEP-Delegate for that PEP. If no suitable candidate can be found, then the
|
|
PEP will be marked as Deferred until one is available.
|
|
|
|
Previously appointed PEP-Delegates may choose to step down, or be asked to step
|
|
down by the Council, in which case a new PEP-Delegate will be appointed in the
|
|
same manner as for a new PEP (including deferral of the PEP if no suitable
|
|
replacement can be found). In the event that a PEP-Delegate is asked to step
|
|
down, this will overrule any prior acceptance or rejection of the PEP, and it
|
|
will revert to Draft status.
|
|
|
|
When such standing delegations are put in place, the Steering Council will
|
|
maintain sufficient public records to allow subsequent Councils, the core
|
|
developers, and the wider Python community to understand the delegations that
|
|
currently exist, why they were put in place, and the circumstances under which
|
|
they may no longer be needed.
|
|
|
|
For a PEP to be accepted it must meet certain minimum criteria. It
|
|
must be a clear and complete description of the proposed enhancement.
|
|
The enhancement must represent a net improvement. The proposed
|
|
implementation, if applicable, must be solid and must not complicate
|
|
the interpreter unduly. Finally, a proposed enhancement must be
|
|
"pythonic" in order to be accepted by the Steering Council. (However,
|
|
"pythonic" is an imprecise term; it may be defined as whatever is acceptable to
|
|
the Steering Council. This logic is intentionally circular.) See :pep:`2`
|
|
for standard library module acceptance criteria.
|
|
|
|
Except where otherwise approved by the Steering Council,
|
|
pronouncements of PEP resolution will be posted to the
|
|
`PEPs category`_ on the `Python Discourse`_.
|
|
|
|
Once a PEP has been accepted, the reference implementation must be
|
|
completed. When the reference implementation is complete and incorporated
|
|
into the main source code repository, the status will be changed to "Final".
|
|
|
|
To allow gathering of additional design and interface feedback before committing
|
|
to long term stability for a language feature or standard library API, a PEP
|
|
may also be marked as "Provisional". This is short for "Provisionally Accepted",
|
|
and indicates that the proposal has been accepted for inclusion in the reference
|
|
implementation, but additional user feedback is needed before the full design
|
|
can be considered "Final". Unlike regular accepted PEPs, provisionally accepted
|
|
PEPs may still be Rejected or Withdrawn *even after the related changes have
|
|
been included in a Python release*.
|
|
|
|
Wherever possible, it is considered preferable to reduce the scope of a proposal
|
|
to avoid the need to rely on the "Provisional" status (e.g. by deferring some
|
|
features to later PEPs), as this status can lead to version compatibility
|
|
challenges in the wider Python ecosystem. :pep:`411` provides additional details
|
|
on potential use cases for the Provisional status.
|
|
|
|
A PEP can also be assigned the status "Deferred". The PEP author or an
|
|
editor can assign the PEP this status when no progress is being made
|
|
on the PEP. Once a PEP is deferred, a PEP editor can reassign it
|
|
to draft status.
|
|
|
|
A PEP can also be "Rejected". Perhaps after all is said and done it
|
|
was not a good idea. It is still important to have a record of this
|
|
fact. The "Withdrawn" status is similar - it means that the PEP author
|
|
themselves has decided that the PEP is actually a bad idea, or has
|
|
accepted that a competing proposal is a better alternative.
|
|
|
|
When a PEP is Accepted, Rejected or Withdrawn, the PEP should be updated
|
|
accordingly. In addition to updating the Status field, at the very least
|
|
the Resolution header should be added with a direct link
|
|
to the relevant post making a decision on the PEP.
|
|
|
|
PEPs can also be superseded by a different PEP, rendering the original
|
|
obsolete. This is intended for Informational PEPs, where version 2 of
|
|
an API can replace version 1.
|
|
|
|
The possible paths of the status of PEPs are as follows:
|
|
|
|
.. image:: pep-0001/process_flow.svg
|
|
:class: invert-in-dark-mode
|
|
:alt: PEP process flow diagram
|
|
|
|
While not shown in the diagram, "Accepted" PEPs may technically move to
|
|
"Rejected" or "Withdrawn" even after acceptance. This will only occur if
|
|
the implementation process reveals fundamental flaws in the design that were
|
|
not noticed prior to acceptance of the PEP. Unlike Provisional PEPs, these
|
|
transitions are only permitted if the accepted proposal has *not* been included
|
|
in a Python release - released changes must instead go through the regular
|
|
deprecation process (which may require a new PEP providing the rationale for
|
|
the deprecation).
|
|
|
|
Some Informational and Process PEPs may also have a status of "Active"
|
|
if they are never meant to be completed. E.g. :pep:`1` (this PEP).
|
|
|
|
|
|
PEP Maintenance
|
|
---------------
|
|
|
|
In general, PEPs are no longer substantially modified after they have reached
|
|
the Accepted, Final, Rejected or Superseded state. Once resolution is reached,
|
|
a PEP is considered a historical document rather than a living specification.
|
|
Formal documentation of the expected behavior should be maintained elsewhere,
|
|
such as the `Language Reference`_ for core features, the `Library Reference`_
|
|
for standard library modules or the `PyPA Specifications`_ for packaging.
|
|
|
|
If changes based on implementation experience and user feedback are made to
|
|
Standards track PEPs while in the Provisional or (with SC approval) Accepted
|
|
state, they should be noted in the PEP, such that the PEP accurately describes
|
|
the implementation at the point where it is marked Final.
|
|
|
|
Active (Informational and Process) PEPs may be updated over time to reflect
|
|
changes to development practices and other details. The precise process
|
|
followed in these cases will depend on the nature and purpose of the PEP
|
|
in question.
|
|
|
|
Occasionally, a Deferred or even a Withdrawn PEP may be resurrected
|
|
with major updates, but it is often better to just propose a new one.
|
|
|
|
|
|
What belongs in a successful PEP?
|
|
=================================
|
|
|
|
Each PEP should have the following parts/sections:
|
|
|
|
1. Preamble -- :rfc:`2822` style headers containing meta-data about the
|
|
PEP, including the PEP number, a short descriptive title (limited
|
|
to a maximum of 44 characters), the names, and optionally the
|
|
contact info for each author, etc.
|
|
|
|
2. Abstract -- a short (~200 word) description of the technical issue
|
|
being addressed.
|
|
|
|
3. Motivation -- The motivation is critical for PEPs that want to
|
|
change the Python language, library, or ecosystem. It should
|
|
clearly explain why the existing language specification is
|
|
inadequate to address the problem that the PEP solves. This can
|
|
include collecting documented support for the PEP from important
|
|
projects in the Python ecosystem. PEP submissions without
|
|
sufficient motivation may be rejected.
|
|
|
|
4. Rationale -- The rationale fleshes out the specification by
|
|
describing why particular design decisions were made. It should
|
|
describe alternate designs that were considered and related work,
|
|
e.g. how the feature is supported in other languages.
|
|
|
|
The rationale should provide evidence of consensus within the
|
|
community and discuss important objections or concerns raised
|
|
during discussion.
|
|
|
|
5. Specification -- The technical specification should describe the
|
|
syntax and semantics of any new language feature. The
|
|
specification should be detailed enough to allow competing,
|
|
interoperable implementations for at least the current major Python
|
|
platforms (CPython, Jython, IronPython, PyPy).
|
|
|
|
6. Backwards Compatibility -- All PEPs that introduce backwards
|
|
incompatibilities must include a section describing these
|
|
incompatibilities and their severity. The PEP must explain how the
|
|
author proposes to deal with these incompatibilities. PEP
|
|
submissions without a sufficient backwards compatibility treatise
|
|
may be rejected outright.
|
|
|
|
7. Security Implications -- If there are security concerns in relation
|
|
to the PEP, those concerns should be explicitly written out to make
|
|
sure reviewers of the PEP are aware of them.
|
|
|
|
8. How to Teach This -- For a PEP that adds new functionality or changes
|
|
language behavior, it is helpful to include a section on how to
|
|
teach users, new and experienced, how to apply the PEP to their
|
|
work.
|
|
|
|
This section may include key points and recommended documentation
|
|
changes that would help users adopt a new feature or migrate their
|
|
code to use a language change.
|
|
|
|
9. Reference Implementation -- The reference implementation must be
|
|
completed before any PEP is given status "Final", but it need not
|
|
be completed before the PEP is accepted. While there is merit
|
|
to the approach of reaching consensus on the specification and
|
|
rationale before writing code, the principle of "rough consensus
|
|
and running code" is still useful when it comes to resolving many
|
|
discussions of API details.
|
|
|
|
The final implementation must include test code and documentation
|
|
appropriate for either the Python language reference or the
|
|
standard library reference.
|
|
|
|
10. Rejected Ideas -- Throughout the discussion of a PEP, various ideas
|
|
will be proposed which are not accepted. Those rejected ideas should
|
|
be recorded along with the reasoning as to why they were rejected.
|
|
This both helps record the thought process behind the final version
|
|
of the PEP as well as preventing people from bringing up the same
|
|
rejected idea again in subsequent discussions.
|
|
|
|
In a way this section can be thought of as a breakout section of the
|
|
Rationale section that is focused specifically on why certain ideas
|
|
were not ultimately pursued.
|
|
|
|
11. Open Issues -- While a PEP is in draft, ideas can come up which
|
|
warrant further discussion. Those ideas should be recorded so people
|
|
know that they are being thought about but do not have a concrete
|
|
resolution. This helps make sure all issues required for the PEP to be
|
|
ready for consideration are complete and reduces people duplicating
|
|
prior discussion.
|
|
|
|
12. Footnotes -- A collection of footnotes cited in the PEP, and
|
|
a place to list non-inline hyperlink targets.
|
|
|
|
13. Copyright/license -- Each new PEP must be placed under a dual license of
|
|
public domain and CC0-1.0-Universal_ (see this PEP for an example).
|
|
|
|
|
|
PEP Formats and Templates
|
|
=========================
|
|
|
|
PEPs are UTF-8 encoded text files using the reStructuredText_ format.
|
|
reStructuredText allows for rich markup that is still quite easy to
|
|
read, but also results in good-looking and functional HTML. :pep:`12`
|
|
contains instructions and a :pep:`PEP template <12#suggested-sections>`.
|
|
|
|
The PEP text files are automatically
|
|
`converted to HTML <https://peps.python.org/docs/rendering_system/>`__
|
|
(via a `Sphinx <https://www.sphinx-doc.org/>`_-based :pep:`build system <676>`)
|
|
for easier `online reading <https://peps.python.org/>`__.
|
|
|
|
|
|
PEP Header Preamble
|
|
===================
|
|
|
|
Each PEP must begin with an :rfc:`2822` style header preamble. The headers
|
|
must appear in the following order. Headers marked with "*" are
|
|
optional and are described below. All other headers are required.
|
|
|
|
.. code-block:: text
|
|
|
|
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>
|
|
|
|
The Author header lists the names, and optionally the email addresses
|
|
of all the authors/owners of the PEP. The format of the Author header
|
|
values must be:
|
|
|
|
.. code-block:: text
|
|
|
|
Random J. User <random@example.com>
|
|
|
|
if the email address is included, and just:
|
|
|
|
.. code-block:: text
|
|
|
|
Random J. User
|
|
|
|
if the address is not given.
|
|
|
|
If there are multiple authors, each should be on a separate line
|
|
following :rfc:`2822` continuation line conventions. Note that personal
|
|
email addresses in PEPs will be obscured as a defense against spam
|
|
harvesters.
|
|
|
|
The Sponsor field records which developer (core, or otherwise approved by the
|
|
Steering Council) is sponsoring the PEP. If one of the authors of the PEP is a
|
|
core developer then no sponsor is necessary and thus this field should be left
|
|
out.
|
|
|
|
The PEP-Delegate field is used to record the individual appointed by the
|
|
Steering Council to make the final decision on whether or not to approve or
|
|
reject a PEP. (The delegate's email address is currently omitted due to a
|
|
limitation in the email address masking for reStructuredText PEPs.)
|
|
|
|
*Note: The Resolution header is required for Standards Track PEPs
|
|
only. It contains a URL that should point to an email message or
|
|
other web resource where the pronouncement about
|
|
(i.e. approval or rejection of) the PEP is made.*
|
|
|
|
The Discussions-To header provides the URL to the current
|
|
canonical discussion thread for the PEP.
|
|
For email lists, this should be a direct link to the thread in the list's
|
|
archives, rather than just a mailto: or hyperlink to the list itself.
|
|
|
|
The Type header specifies the type of PEP: Standards Track,
|
|
Informational, or Process.
|
|
|
|
The optional Topic header lists the special topic, if any,
|
|
the PEP belongs under.
|
|
See the :ref:`topic-index` for the existing topics.
|
|
|
|
The Created header records the date that the PEP was assigned a
|
|
number, while Post-History is used to record the dates of and corresponding
|
|
URLs to the Discussions-To threads for the PEP, with the former as the
|
|
linked text, and the latter as the link target.
|
|
Both sets of dates should be in ``dd-mmm-yyyy`` format, e.g. ``14-Aug-2001``.
|
|
|
|
Standards Track PEPs will typically have a Python-Version header which
|
|
indicates the version of Python that the feature will be released with.
|
|
Standards Track PEPs without a Python-Version header indicate
|
|
interoperability standards that will initially be supported through
|
|
external libraries and tools, and then potentially supplemented by a later PEP
|
|
to add support to the standard library. Informational and Process PEPs do
|
|
not need a Python-Version header.
|
|
|
|
PEPs may have a Requires header, indicating the PEP numbers that this
|
|
PEP depends on.
|
|
|
|
PEPs may also have a Superseded-By header indicating that a PEP has
|
|
been rendered obsolete by a later document; the value is the number of
|
|
the PEP that replaces the current document. The newer PEP must have a
|
|
Replaces header containing the number of the PEP that it rendered
|
|
obsolete.
|
|
|
|
|
|
Auxiliary Files
|
|
===============
|
|
|
|
PEPs may include auxiliary files such as diagrams. Such files should be
|
|
named ``pep-XXXX-Y.ext``, where "XXXX" is the PEP number, "Y" is a
|
|
serial number (starting at 1), and "ext" is replaced by the actual
|
|
file extension (e.g. "png").
|
|
|
|
Alternatively, all support files may be placed in a subdirectory called
|
|
``pep-XXXX``, where "XXXX" is the PEP number. When using a subdirectory, there
|
|
are no constraints on the names used in files.
|
|
|
|
|
|
Changing Existing PEPs
|
|
======================
|
|
|
|
Draft PEPs are freely open for discussion and proposed modification, at the
|
|
discretion of the authors, until submitted to the Steering Council or
|
|
PEP-Delegate for review and resolution. Substantive content changes should
|
|
generally be first proposed on the PEP's discussion thread listed in its
|
|
``Discussions-To`` header, while copyedits and corrections can be submitted
|
|
as a `GitHub issue`_ or `GitHub pull request`_.
|
|
PEP authors with write access to the PEP repository can update the PEPs
|
|
themselves by using ``git push`` or a GitHub PR to submit their changes.
|
|
For guidance on modifying other PEPs, consult the `PEP Maintenance`_ section.
|
|
|
|
See the `Contributing Guide`_ for additional details, and when in doubt,
|
|
please check first with the PEP author and/or a PEP editor.
|
|
|
|
|
|
Transferring PEP Ownership
|
|
==========================
|
|
|
|
It occasionally becomes necessary to transfer ownership of PEPs to a
|
|
new champion. In general, it is preferable to retain the original author as
|
|
a co-author of the transferred PEP, but that's really up to the
|
|
original author. A good reason to transfer ownership is because the
|
|
original author no longer has the time or interest in updating it or
|
|
following through with the PEP process, or has fallen off the face of
|
|
the 'net (i.e. is unreachable or not responding to email). A bad
|
|
reason to transfer ownership is because the author doesn't agree with the
|
|
direction of the PEP. One aim of the PEP process is to try to build
|
|
consensus around a PEP, but if that's not possible, an author can always
|
|
submit a competing PEP.
|
|
|
|
If you are interested in assuming ownership of a PEP, you can also do this via
|
|
pull request. Fork the `PEP repository`_, make your ownership modification,
|
|
and submit a pull request. You should mention both the original author and
|
|
``@python/pep-editors`` in a comment on the pull request. (If the original
|
|
author's GitHub username is unknown, use email.) If the original author
|
|
doesn't respond in a timely manner, the PEP editors will make a
|
|
unilateral decision (it's not like such decisions can't be reversed :).
|
|
|
|
|
|
PEP Editor Responsibilities & Workflow
|
|
======================================
|
|
|
|
A PEP editor must be added to the ``@python/pep-editors`` group on GitHub and
|
|
must watch the `PEP repository`_.
|
|
|
|
Note that developers with write access to the `PEP repository`_ may
|
|
handle the tasks that would normally be taken care of by the PEP editors.
|
|
Alternately, even developers may request assistance from PEP editors by
|
|
mentioning ``@python/pep-editors`` on GitHub.
|
|
|
|
For each new PEP that comes in an editor does the following:
|
|
|
|
* Make sure that the PEP is either co-authored by a core developer, has a core
|
|
developer as a sponsor, or has a sponsor specifically approved for this PEP
|
|
by the Steering Council.
|
|
|
|
* Read the PEP to check if it is ready: sound and complete. The ideas
|
|
must make technical sense, even if they don't seem likely to be
|
|
accepted.
|
|
|
|
* The title should accurately describe the content.
|
|
|
|
* The file name extension is correct (i.e. ``.rst``).
|
|
|
|
* Ensure that everyone listed as a sponsor or co-author of the PEP who has write
|
|
access to the `PEP repository`_ is added to `.github/CODEOWNERS`_.
|
|
|
|
* Skim the PEP for obvious defects in language (spelling, grammar,
|
|
sentence structure, etc.), and code style (examples should conform to
|
|
:pep:`7` & :pep:`8`). Editors may correct problems themselves, but are
|
|
not required to do so (reStructuredText syntax is checked by the repo's CI).
|
|
|
|
* If a project is portrayed as benefiting from or supporting the PEP, make sure
|
|
there is some direct indication from the project included to make the support
|
|
clear. This is to avoid a PEP accidentally portraying a project as supporting
|
|
a PEP when in fact the support is based on conjecture.
|
|
|
|
If the PEP isn't ready, an editor will send it back to the author for
|
|
revision, with specific instructions. If reST formatting is a
|
|
problem, ask the author(s) to use :pep:`12` as a template and resubmit.
|
|
|
|
Once the PEP is ready for the repository, a PEP editor will:
|
|
|
|
* Check that the author has selected a valid PEP number or assign them a
|
|
number if they have not (almost always just the next available number, but
|
|
sometimes it's a special/joke number, like 666 or 3141).
|
|
|
|
Remember that numbers below 100 are meta-PEPs.
|
|
|
|
* Check that the author has correctly labeled the PEP's type
|
|
("Standards Track", "Informational", or "Process"), and marked its
|
|
status as "Draft".
|
|
|
|
* Ensure all CI build and lint checks pass without errors,
|
|
and there are no obvious issues in the rendered preview output.
|
|
|
|
* Merge the new (or updated) PEP.
|
|
|
|
* Inform the author of the next steps (open a discussion thread and
|
|
update the PEP with it, post an announcement, etc).
|
|
|
|
Updates to existing PEPs should be submitted as a `GitHub pull request`_.
|
|
|
|
Many PEPs are written and maintained by developers with write access
|
|
to the Python codebase. The PEP editors monitor the PEP repository
|
|
for changes, and correct any structure, grammar, spelling, or
|
|
markup mistakes they see.
|
|
|
|
PEP editors don't pass judgment on PEPs. They merely do the
|
|
administrative & editorial part (which is generally a low volume task).
|
|
|
|
Resources:
|
|
|
|
* `Index of Python Enhancement Proposals <https://peps.python.org/>`_
|
|
|
|
* `Following Python's Development
|
|
<https://devguide.python.org/communication/>`_
|
|
|
|
* `Python Developer's Guide <https://devguide.python.org/>`_
|
|
|
|
|
|
Footnotes
|
|
=========
|
|
|
|
.. _.github/CODEOWNERS: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
|
|
|
|
.. _Python issue tracker: https://github.com/python/cpython/issues
|
|
|
|
.. _CC0-1.0-Universal: https://choosealicense.com/licenses/cc0-1.0/
|
|
|
|
.. _reStructuredText: https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html
|
|
|
|
.. _PEP repository: https://github.com/python/peps
|
|
|
|
.. _GitHub pull request: https://github.com/python/peps/pulls
|
|
|
|
.. _GitHub issue: https://github.com/python/peps/issues
|
|
|
|
.. _Steering Council issue: https://github.com/python/steering-council/issues/new/choose
|
|
|
|
.. _Python-Dev: https://mail.python.org/mailman3/lists/python-dev.python.org/
|
|
|
|
.. _Python Discourse: https://discuss.python.org/
|
|
|
|
.. _Ideas category: https://discuss.python.org/c/ideas/
|
|
|
|
.. _PEPs category: https://discuss.python.org/c/peps/
|
|
|
|
.. _Typing category: https://discuss.python.org/c/typing/
|
|
|
|
.. _Packaging category: https://discuss.python.org/c/packaging/
|
|
|
|
.. _Language Reference: https://docs.python.org/3/reference/index.html
|
|
|
|
.. _Library Reference: https://docs.python.org/3/library/index.html
|
|
|
|
.. _PyPA Specifications: https://packaging.python.org/en/latest/specifications/
|
|
|
|
.. _Contributing Guide: https://github.com/python/peps/blob/main/CONTRIBUTING.rst
|
|
|
|
|
|
Copyright
|
|
=========
|
|
|
|
This document is placed in the public domain or under the
|
|
CC0-1.0-Universal license, whichever is more permissive.
|