In jaraco/zipp#37 and others, I've learned that universal wheels are essentially meaningless as they declare "work on all Python 2 and Python 3 versions" when in fact they have minimum Python 2 and Python 3 versions.
The baseline packaging default for generating wheels for pure-python distributions was bad enough when it required specifying universal=1 for wheels to get py2/3 compatibility, but now I learn that behavior is unsatisfactory for projects targeting Python 3 and now users are demanding that the python tag be updated to declare the minimum supported Python version(s).
The Requires-Python (python_requires distutils option) was created to declare these requirements more directly, but this functionality didn't supersede the PEP 425 expectations that the Python tag should indicate the minimum supported Python version (or versions) that the build supports.
It is recommended that installers try to choose the most feature complete built distribution available (the one most specific to the installation environment) by default before falling back to pure Python versions published for older Python releases.
What this means ultimately is that package maintainers are required to declare their supported Python versions in at least two, maybe three places:
- In the Requires-Python spec
- In the python-tag for wheels
- In Trove classifiers
I'm excluding Trove classifiers from this discussion.
I propose that bdist_wheel, instead of defaulting to the py3 or py2 should default to a value matching the Requires-Python directive, and determine the minimum python 2 and python 3 versions relevant to the project and use that. So if python_requires = '>=3.6', it should use py36 for the tag. And if python_requires = '>=2.7.13,!=3.0.*,!=3.1.*', the python tag should be py27.py32.
This scheme would allow the packager to declare the supported versions in one place and derive the (default) python tags for the build.
In jaraco/zipp#37 and others, I've learned that universal wheels are essentially meaningless as they declare "work on all Python 2 and Python 3 versions" when in fact they have minimum Python 2 and Python 3 versions.
The baseline packaging default for generating wheels for pure-python distributions was bad enough when it required specifying
universal=1for wheels to get py2/3 compatibility, but now I learn that behavior is unsatisfactory for projects targeting Python 3 and now users are demanding that the python tag be updated to declare the minimum supported Python version(s).The Requires-Python (python_requires distutils option) was created to declare these requirements more directly, but this functionality didn't supersede the PEP 425 expectations that the Python tag should indicate the minimum supported Python version (or versions) that the build supports.
What this means ultimately is that package maintainers are required to declare their supported Python versions in at least two, maybe three places:
I'm excluding Trove classifiers from this discussion.
I propose that bdist_wheel, instead of defaulting to the
py3orpy2should default to a value matching the Requires-Python directive, and determine the minimum python 2 and python 3 versions relevant to the project and use that. So ifpython_requires = '>=3.6', it should usepy36for the tag. And ifpython_requires = '>=2.7.13,!=3.0.*,!=3.1.*', the python tag should bepy27.py32.This scheme would allow the packager to declare the supported versions in one place and derive the (default) python tags for the build.