PEP 641: Using an underscore in the version portion of Python 3.10 compatibility tags (#1667)
This commit is contained in:
parent
5f9a50d3d4
commit
fcb588a889
|
@ -0,0 +1,154 @@
|
|||
PEP: 641
|
||||
Title: Using an underscore in the version portion of Python 3.10 compatibility tags
|
||||
Author: Brett Cannon <brett@python.org>,
|
||||
Steve Dower <steve.dower@python.org>,
|
||||
Barry Warsaw <barry@python.org>
|
||||
BDFL-Delegate:
|
||||
Discussions-To:
|
||||
Status: Draft
|
||||
Type: Standards Track
|
||||
Content-Type: text/x-rst
|
||||
Created: 2020-10-20
|
||||
Python-Version: 3.10
|
||||
Post-History: 2020-10-20
|
||||
Resolution:
|
||||
|
||||
Abstract
|
||||
========
|
||||
|
||||
Using the tag system outlined in :pep:`425` (primarily used for wheel
|
||||
file names), each release of Python specifies compatibility tags
|
||||
(e.g. ``cp39``, ``py39`` for CPython 3.9). For CPython 3.10, this PEP
|
||||
proposes using ``3_10`` as the version portion of the tags
|
||||
(instead of ``310``).
|
||||
|
||||
|
||||
Motivation
|
||||
==========
|
||||
|
||||
Up to this point, the version portion of compatibility tags used in
|
||||
e.g. wheel file names has been a straight concatenation of the major
|
||||
and minor versions of Python, both for the CPython interpreter tag and
|
||||
the generic, interpreter-agnostic interpreter tag (e.g. ``cp39`` and
|
||||
``py39``, respectively). This also applies to the ABI tag
|
||||
(e.g. ``cp39``). Thanks to both the major and minor versions being
|
||||
single digits, it has been unambiguous what which digit in e.g. ``39``
|
||||
represented.
|
||||
|
||||
But starting with Python 3.10, ambiguity comes up as ``310`` does not
|
||||
clearly delineate whether the Python version is ``3.10``, ``31.0``, or
|
||||
``310`` as the major-only version of Python. Thus using ``3_10`` to
|
||||
separate major/minor portions as allowed by :pep:`425` disambiguates
|
||||
the Python version being supported.
|
||||
|
||||
|
||||
Rationale
|
||||
=========
|
||||
|
||||
Using ``3_10`` instead of another proposed separator is a restriction
|
||||
of :pep:`425`, thus the only options are ``3_10`` or ``310``.
|
||||
|
||||
|
||||
Specification
|
||||
=============
|
||||
|
||||
The ``SOABI`` configure variable and
|
||||
``sysconfig.get_config_var('py_version_nodot')`` will be updated to
|
||||
use ``3_10`` appropriately.
|
||||
|
||||
|
||||
Backwards Compatibility
|
||||
=======================
|
||||
|
||||
Tools relying on the 'packaging' project [2]_ already expect a
|
||||
version specification of ``3_10`` for Python 3.10. Keeping the version
|
||||
specifier as ``310`` would require backing that change out and
|
||||
updating dependent projects (e.g. pip).
|
||||
|
||||
Switching to ``3_10`` will impact any tools that implicitly rely on
|
||||
the convention that the minor version is a single digit. However,
|
||||
these are broken regardless of any change here.
|
||||
|
||||
For tools assuming the major version is only the first digit, they
|
||||
will require updating if we switch to ``3_10``.
|
||||
|
||||
In non-locale ASCII, ``_`` sorts after any digit, so lexicographic
|
||||
sorting matching a sort by Python version of a wheel file name will be
|
||||
kept.
|
||||
|
||||
Since PEP 515 (Python 3.6), underscores in numeric literals are ignored.
|
||||
This means that ``int("3_10")`` and ``int("310")`` produce the same result,
|
||||
and ordering based on conversion to an integer will be preserved.
|
||||
**However**, this is still a bad way to sort tags, and the point is raised
|
||||
here simply to show that this proposal does not make things worse.
|
||||
|
||||
Security Implications
|
||||
=====================
|
||||
|
||||
There are no known security concerns.
|
||||
|
||||
|
||||
How to Teach This
|
||||
=================
|
||||
|
||||
As use of the interpreter tag is mostly machine-based and this PEP
|
||||
disambiguates, there should not be any special teaching consideration
|
||||
required.
|
||||
|
||||
|
||||
Reference Implementation
|
||||
========================
|
||||
|
||||
A pull request [1]_ already exists adding support to CPython 3.10.
|
||||
Support for reading wheel files with this proposed PEP is already
|
||||
implemented.
|
||||
|
||||
|
||||
Rejected Ideas
|
||||
==============
|
||||
|
||||
Not making the change
|
||||
---------------------
|
||||
It was considered to not change the tag and stay with ``310``. The
|
||||
argument was it's less work and it won't break any existing
|
||||
tooling. But in the end it was thought that the disambiguation is
|
||||
better to have.
|
||||
|
||||
|
||||
Open Issues
|
||||
===========
|
||||
|
||||
How far should we take this?
|
||||
----------------------------
|
||||
Other places where the major and minor version are used could be
|
||||
updated to use an underscore as well (e.g. ``.pyc`` files, the import
|
||||
path to the zip file for the stdlib). It is not known how useful it
|
||||
would be to make this pervasive.
|
||||
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
.. [1] Reference implementation
|
||||
(https://github.com/python/cpython/pull/20333)
|
||||
|
||||
.. [2] The 'packaging' project
|
||||
(https://pypi.org/project/packaging/)
|
||||
|
||||
|
||||
Copyright
|
||||
=========
|
||||
|
||||
This document is placed in the public domain or under the
|
||||
CC0-1.0-Universal license, whichever is more permissive.
|
||||
|
||||
|
||||
|
||||
..
|
||||
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