PEP: 641 Title: Using an underscore in the version portion of Python 3.10 compatibility tags Author: Brett Cannon , Steve Dower , Barry Warsaw BDFL-Delegate: Discussions-To: https://discuss.python.org/t/pep-641-using-an-underscore-in-the-version-portion-of-python-3-10-compatibility-tags/5513 Status: Draft Type: Standards Track Content-Type: text/x-rst Created: 2020-10-20 Python-Version: 3.10 Post-History: 2020-10-21 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: