Add PEP 408: __preview__ namespace
This commit is contained in:
parent
67bd2dd4b4
commit
cb213988f3
|
@ -0,0 +1,291 @@
|
||||||
|
PEP: 408
|
||||||
|
Title: Standard library __preview__ package
|
||||||
|
Version: $Revision$
|
||||||
|
Last-Modified: $Date$
|
||||||
|
Author: Nick Coghlan <ncoghlan@gmail.com>,
|
||||||
|
Eli Bendersky <eliben@gmail.com>
|
||||||
|
Status: Draft
|
||||||
|
Type: Standards Track
|
||||||
|
Content-Type: text/x-rst
|
||||||
|
Created: 2012-01-07
|
||||||
|
Python-Version: 3.3
|
||||||
|
Post-History: 2012-01-27
|
||||||
|
|
||||||
|
|
||||||
|
Abstract
|
||||||
|
========
|
||||||
|
|
||||||
|
The process of including a new module into the Python standard library is
|
||||||
|
hindered by the API lock-in and promise of backward compatibility implied by
|
||||||
|
a module being formally part of Python. This PEP proposes a transitional
|
||||||
|
state for modules - inclusion in a special ``__preview__`` package for the
|
||||||
|
duration of a minor release (roughly 18 months) prior to full acceptance into
|
||||||
|
the standard library. On one hand, this state provides the module with the
|
||||||
|
benefits of being formally part of the Python distribution. On the other hand,
|
||||||
|
the core development team explicitly states that no promises are made with
|
||||||
|
regards to the module's eventual full inclusion into the standard library,
|
||||||
|
or to the stability of its API, which may change for the next release.
|
||||||
|
|
||||||
|
|
||||||
|
Proposal - the __preview__ package
|
||||||
|
==================================
|
||||||
|
|
||||||
|
Whenever the Python core development team decides that a new module should be
|
||||||
|
included into the standard library, but isn't entirely sure about whether the
|
||||||
|
module's API is optimal, the module can be placed in a special package named
|
||||||
|
``__preview__`` for a single minor release.
|
||||||
|
|
||||||
|
In the next minor release, the module may either be "graduated" into the
|
||||||
|
standard library (and occupy its natural place within its namespace, leaving the
|
||||||
|
``__preview__`` package), or be rejected and removed entirely from the Python
|
||||||
|
source tree. If the module ends up graduating into the standard library after
|
||||||
|
spending a minor release in ``__preview__``, its API may be changed according
|
||||||
|
to accumulated feedback. The core development team explicitly makes no
|
||||||
|
guarantees about API stability and backward compatibility of modules in
|
||||||
|
``__preview__``.
|
||||||
|
|
||||||
|
Entry into the ``__preview__`` package marks the start of a transition of the
|
||||||
|
module into the standard library. It means that the core development team
|
||||||
|
assumes responsibility of the module, similarly to any other module in the
|
||||||
|
standard library.
|
||||||
|
|
||||||
|
|
||||||
|
Which modules should go through ``__preview__``
|
||||||
|
-----------------------------------------------
|
||||||
|
|
||||||
|
We expect most modules proposed for addition into the Python standard library
|
||||||
|
to go through a minor release in ``__preview__``. There may, however, be some
|
||||||
|
exceptions, such as modules that use a pre-defined API (for example ``lzma``,
|
||||||
|
which generally follows the API of the existing ``bz2`` module), or modules
|
||||||
|
with an API that has wide acceptance in the Python development community.
|
||||||
|
|
||||||
|
In any case, modules that are proposed to be added to the standard library,
|
||||||
|
whether via ``__preview__`` or directly, must fulfill the acceptance conditions
|
||||||
|
set by PEP 2.
|
||||||
|
|
||||||
|
It is important to stress that the aim of of this proposal is not to make the
|
||||||
|
process of adding new modules to the standard library more difficult. On the
|
||||||
|
contrary, it tries to provide a means to add *more* useful libraries. Modules
|
||||||
|
which are obvious candidates for entry can be added as before. Modules which
|
||||||
|
due to uncertainties about the API could be stalled for a long time now have
|
||||||
|
a means to still be distributed with Python, via an incubation period in the
|
||||||
|
``__preview__`` package.
|
||||||
|
|
||||||
|
|
||||||
|
Criteria for "graduation"
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
In principle, most modules in the ``__preview__`` package should eventually
|
||||||
|
graduate to the stable standard library. Some reasons for not graduating are:
|
||||||
|
|
||||||
|
* The module may prove to be unstable or fragile, without sufficient developer
|
||||||
|
support to maintain it.
|
||||||
|
* A much better alternative module may be found during the preview release
|
||||||
|
|
||||||
|
Essentially, the decision will be made by the core developers on a per-case
|
||||||
|
basis. The point to emphasize here is that a module's appearance in the
|
||||||
|
``__preview__`` package in some release does not guarantee it will continue
|
||||||
|
being part of Python in the next release.
|
||||||
|
|
||||||
|
|
||||||
|
Example
|
||||||
|
-------
|
||||||
|
|
||||||
|
Suppose the ``example`` module is a candidate for inclusion in the standard
|
||||||
|
library, but some Python developers aren't convinced that it presents the best
|
||||||
|
API for the problem it intends to solve. The module can then be added to the
|
||||||
|
``__preview__`` package in release ``3.X``, importable via::
|
||||||
|
|
||||||
|
from __preview__ import example
|
||||||
|
|
||||||
|
Assuming the module is then promoted to the the standard library proper in
|
||||||
|
release ``3.X+1``, it will be moved to a permanent location in the library::
|
||||||
|
|
||||||
|
import example
|
||||||
|
|
||||||
|
And importing it from ``__preview__`` will no longer work.
|
||||||
|
|
||||||
|
|
||||||
|
Rationale
|
||||||
|
=========
|
||||||
|
|
||||||
|
Benefits for the core development team
|
||||||
|
--------------------------------------
|
||||||
|
|
||||||
|
Currently, the core developers are really reluctant to add new interfaces to
|
||||||
|
the standard library. This is because as soon as they're published in a
|
||||||
|
release, API design mistakes get locked in due to backward compatibility
|
||||||
|
concerns.
|
||||||
|
|
||||||
|
By gating all major API additions through some kind of a preview mechanism
|
||||||
|
for a full release, we get one full release cycle of community feedback
|
||||||
|
before we lock in the APIs with our standard backward compatibility guarantee.
|
||||||
|
|
||||||
|
We can also start integrating preview modules with the rest of the standard
|
||||||
|
library early, so long as we make it clear to packagers that the preview
|
||||||
|
modules should not be considered optional. The only difference between preview
|
||||||
|
APIs and the rest of the standard library is that preview APIs are explicitly
|
||||||
|
exempted from the usual backward compatibility guarantees.
|
||||||
|
|
||||||
|
Essentially, the ``__preview__`` package is intended to lower the risk of
|
||||||
|
locking in minor API design mistakes for extended periods of time. Currently,
|
||||||
|
this concern can block new additions, even when the core development team
|
||||||
|
consensus is that a particular addition is a good idea in principle.
|
||||||
|
|
||||||
|
|
||||||
|
Benefits for end users
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
For future end users, the broadest benefit lies in a better "out-of-the-box"
|
||||||
|
experience - rather than being told "oh, the standard library tools for task X
|
||||||
|
are horrible, download this 3rd party library instead", those superior tools
|
||||||
|
are more likely to be just be an import away.
|
||||||
|
|
||||||
|
For environments where developers are required to conduct due diligence on
|
||||||
|
their upstream dependencies (severely harming the cost-effectiveness of, or
|
||||||
|
even ruling out entirely, much of the material on PyPI), the key benefit lies
|
||||||
|
in ensuring that anything in the ``__preview__`` package is clearly under
|
||||||
|
python-dev's aegis from at least the following perspectives:
|
||||||
|
|
||||||
|
* Licensing: Redistributed by the PSF under a Contributor Licensing Agreement.
|
||||||
|
* Documentation: The documentation of the module is published and organized via
|
||||||
|
the standard Python documentation tools (i.e. ReST source, output generated
|
||||||
|
with Sphinx and published on http://docs.python.org).
|
||||||
|
* Testing: The module test suites are run on the python.org buildbot fleet
|
||||||
|
and results published via http://www.python.org/dev/buildbot.
|
||||||
|
* Issue management: Bugs and feature requests are handled on
|
||||||
|
http://bugs.python.org
|
||||||
|
* Source control: The master repository for the software is published
|
||||||
|
on http://hg.python.org.
|
||||||
|
|
||||||
|
|
||||||
|
Candidates for inclusion into __preview__
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
For Python 3.3, there are a number of clear current candidates:
|
||||||
|
|
||||||
|
* ``regex`` (http://pypi.python.org/pypi/regex)
|
||||||
|
* ``daemon`` (PEP 3143)
|
||||||
|
* ``ipaddr`` (PEP 3144)
|
||||||
|
|
||||||
|
Other possible future use cases include:
|
||||||
|
|
||||||
|
* Improved HTTP modules (e.g. ``requests``)
|
||||||
|
* HTML 5 parsing support (e.g. ``html5lib``)
|
||||||
|
* Improved URL/URI/IRI parsing
|
||||||
|
* A standard image API (PEP 368)
|
||||||
|
* Encapsulation of the import state (PEP 368)
|
||||||
|
* Standard event loop API (PEP 3153)
|
||||||
|
* A binary version of WSGI for Python 3 (e.g. PEP 444)
|
||||||
|
* Generic function support (e.g. ``simplegeneric``)
|
||||||
|
|
||||||
|
|
||||||
|
Relationship with PEP 407
|
||||||
|
=========================
|
||||||
|
|
||||||
|
PEP 407 proposes a change to the core Python release cycle to permit interim
|
||||||
|
releases every 6 months (perhaps limited to standard library updates). If
|
||||||
|
such a change to the release cycle is made, the following policy for the
|
||||||
|
``__preview__`` namespace is suggested:
|
||||||
|
|
||||||
|
* For long term support releases, the ``__preview__`` namespace would always
|
||||||
|
be empty.
|
||||||
|
* New modules would be accepted into the ``__preview__`` namespace only in
|
||||||
|
interim releases that immediately follow a long term support release.
|
||||||
|
* All modules added will either be migrated to their final location in the
|
||||||
|
standard library or dropped entirely prior to the next long term support
|
||||||
|
release.
|
||||||
|
|
||||||
|
|
||||||
|
Rejected alternatives and variations
|
||||||
|
====================================
|
||||||
|
|
||||||
|
|
||||||
|
Using ``__future__``
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
Python already has a "forward-looking" namespace in the form of the
|
||||||
|
``__future__`` module, so it's reasonable to ask why that can't be re-used for
|
||||||
|
this new purpose.
|
||||||
|
|
||||||
|
There are two reasons why doing so not appropriate:
|
||||||
|
|
||||||
|
1. The ``__future__`` module is actually linked to a separate compiler
|
||||||
|
directives feature that can actually change the way the Python interpreter
|
||||||
|
compiles a module. We don't want that for the preview package - we just want
|
||||||
|
an ordinary Python package.
|
||||||
|
|
||||||
|
2. The ``__future__`` module comes with an express promise that names will be
|
||||||
|
maintained in perpetuity, long after the associated features have become the
|
||||||
|
compiler's default behaviour. Again, this is precisely the opposite of what is
|
||||||
|
intended for the preview package - it is almost certain that all names added to
|
||||||
|
the preview will be removed at some point, most likely due to their being moved
|
||||||
|
to a permanent home in the standard library, but also potentially due to their
|
||||||
|
being reverted to third party package status (if community feedback suggests the
|
||||||
|
proposed addition is irredeemably broken).
|
||||||
|
|
||||||
|
|
||||||
|
Versioning the package
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
One proposed alternative [1]_ was to add explicit versioning to the
|
||||||
|
``__preview__`` package, i.e. ``__preview34__``. We think that it's better to
|
||||||
|
simply define that a module being in ``__preview__`` in Python 3.X will either
|
||||||
|
graduate to the normal standard library namespace in Python 3.X+1 or will
|
||||||
|
disappear from the Python source tree altogether. Versioning the ``_preview__``
|
||||||
|
package complicates the process and does not align well with the main intent of
|
||||||
|
this proposal.
|
||||||
|
|
||||||
|
|
||||||
|
Using a package name without leading and trailing underscores
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
It was proposed [1]_ to use a package name like ``preview`` or ``exp``, instead
|
||||||
|
of ``__preview__``. This was rejected in the discussion due to the special
|
||||||
|
meaning a "dunder" (double-underscore) package name (a name *with* leading and
|
||||||
|
trailing underscores) conveys in Python. Besides, a non-dunder name indicates
|
||||||
|
stability, which is not the intention of the ``__preview__`` package.
|
||||||
|
|
||||||
|
|
||||||
|
Preserving pickle compatibility
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
A pickled class instance based on a module in ``__preview__`` in release 3.X
|
||||||
|
won't be unpickle-able in release 3.X+1, where the module won't be in
|
||||||
|
``__preview__``. Special code may be added to make this work, but this goes
|
||||||
|
against the intent of this proposal, since it implies backward compatibility.
|
||||||
|
Therefore, this PEP does not propose to preserve pickle compatibility.
|
||||||
|
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Dj Gilcrease initially proposed the idea of having a ``__preview__`` package
|
||||||
|
in Python [2]_. Although his original proposal uses the name
|
||||||
|
``__experimental__``, we feel that ``__preview__`` conveys the meaning of this
|
||||||
|
package in a better way.
|
||||||
|
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. [#] Discussed in this thread:
|
||||||
|
http://mail.python.org/pipermail/python-ideas/2012-January/013246.html
|
||||||
|
|
||||||
|
.. [#] http://mail.python.org/pipermail/python-ideas/2011-August/011278.html
|
||||||
|
|
||||||
|
|
||||||
|
Copyright
|
||||||
|
=========
|
||||||
|
|
||||||
|
This document has been placed in the public domain.
|
||||||
|
|
||||||
|
|
||||||
|
..
|
||||||
|
Local Variables:
|
||||||
|
mode: indented-text
|
||||||
|
indent-tabs-mode: nil
|
||||||
|
sentence-end-double-space: t
|
||||||
|
fill-column: 70
|
||||||
|
coding: utf-8
|
||||||
|
End:
|
Loading…
Reference in New Issue