On Mon, 27 Aug 2018 at 19:05 Nathaniel Smith <n...@pobox.com> wrote:

> I think the answer to all of these questions is "well, no-one's ever
> really looked that closely".
>

I figured, but I just needed someone to verify that hunch was correct. :)


>
> There's a theory behind the tags; they're supposed to be a reasonably
> expressive language for talking about Python dialect compatibility,
> Python C ABI compatibility, and platform ABI compatibility,
> respectively. But in practice so far only a small fixed set of tag
> combinations actually gets used, so there's plenty of room for weird
> stuff to accumulate in the corners where no-one looks.
>

Yep. There's also the side-effect that the pep425tags code that the various
tools have embedded makes some very broad assumptions that all interpreters
follow a tagging/versioning style similar to what is used for CPython,
hence the odd PyPy3 results where the "3" part of the interpreter _name_
gets used as if it's a major version.


>
> I've never been able to figure out a use case for the interpreter tags
> in the first field ("cp36", "pp3", etc).


To help answer that, here are some statistics on the number of projects
that have a certain wheel tag based on download counts on 2018-08-24.

   - cp36
   - %cp36-none-any.whl: 7 (example
      <https://pypi.org/project/google-python-cloud-debugger/2.8/#files>)
      - %cp36-none-%.whl: 70 (example
      <https://pypi.org/project/qucumber/#files>)
      - cp36-none-%.whl but not cp36-none-any.whl: 65 (example
      <https://pypi.org/project/numpy/1.15.1/#files>that Nathaniel knows
      very well ;)
   - cp3
   - %cp3-none-any.whl: 2 (example <https://pypi.org/project/kinto/#files>)
      - %cp3-none-%.whl: 3 (example
      <https://pypi.org/project/billiard/3.3.0.23/#files>)
      - cp3-%: 3 (same as cp3-none-%)
   - py36
   - py36-none-% but not py36-none-any: 2 (example
      <https://pypi.org/project/pytrack-analysis/0.0.3/#files>)
   - py3
      - py3-none-% but not py3-none-any: 142 (example
      <https://pypi.org/project/mypy/0.511/#files>)
      - pp3
      - %pp3-%: 1 (example <https://pypi.org/project/cliquet/3.1.1/#files>)
   - pp360
      - %pp360-%: 6 (example <https://pypi.org/project/Pillow/5.2.0/#files>)

To put this into perspective, there are currently 150,410 projects on PyPI.
Plus a lot of those odd examples for broadly stated interpreter versions
consistently come from the kinto and cliquet projects (although not for
their latest releases).

In the end I think you can view the interpreter tag as representing a
namespace for the ABI tag. Otherwise it technically isn't necessary as you
could just use either an interpreter version or Python version as a form of
ABI tag and drop the interpreter tag.


> IIUC, the theory is that
> they're supposed to mean "the Python code in this package is not
> actually portable Python, but uses an interpreter-specific dialect of
> the language". (This is very different from the second field, where
> tags like "cp36m" tell you about the required C ABI -- that one is
> obviously super useful.) I guess if you had a package that like,
> absolutely depended on GC being refcount-based, you could use a cp3
> tag to indicate that, or if you had a pure-Python, python 2 package,
> that required 'dict' to be ordered, maybe that's 'pp2-none-any'? But
> this never seems to actually happen in practice. It seems like an idea
> that sounded plausible early on, and then never got fleshed out or
> revisited.
>

Yeah, and it actually isn't expressive _enough_ to be self-contained to
cover all use-cases for these tags because the "Python version" tag --
which I consider the interpreter tag -- doesn't necessarily cover Python
version compatibility for the interpreter that's been specified. This
becomes a need when you want to figure out what wheel is the best fit for
Python for a certain interpreter (i.e. if I was a cloud provider and said
what Python was supported by tag triple it actually wouldn't be enough to
download appropriate wheels without also knowing the Python version as a
side-channel bit of information). Not a huge deal, but something I noticed.


>
> The distutils folks have never sat down to seriously think about
> non-CPython implementations, where the language version and the
> implementation version are separate things.
>

Guess what I've started doing? ;)


>
> The pypy folks have never sat down to seriously think about API/ABI
> stability. Generally at the Python dialect level they try to match a
> given version of (C)Python, and at the ABI level every new release is
> a new ABI.
>
> My guess is you shouldn't spend too much effort on trying to slavishly
> reproduce pip's logic, and that if you wanted to go clean up pip's
> logic (and maybe extract it into a reusable library?) then the devs
> would be perfectly happy that someone was doing it...
>

That's exactly what I'm in the process of doing. :) My goal is to have a
library that tools will drop their internal copies of pep425tags for so
there's a standardized PEP 425 implementation. I just wanted to make sure
that before I write any more code that I knew what needed to be handled for
backwards-compatibility versus what is a historical accident or was a guess
at what the future might need when the PEP was written.

Anyway, I will give this a think and try to come up with a reasonable
algorithm for generating the sequence of supported tags based on a specific
tag and Python version and then code that up into a library (at least I
will definitely have something to work on at the dev sprints :) .

-Brett


>
> -n
>
> On Mon, Aug 27, 2018 at 6:28 PM, Brett Cannon <br...@python.org> wrote:
> > And to help in getting a reply, here is the trimmed-down results for
> CPython
> > 3.7 to compare against:
> >
> >     [('cp37', 'cp37m', 'macosx_10_13_x86_64'),
> >     …
> >      ('cp37', 'abi3', 'macosx_10_13_x86_64'),
> >     …
> >       ('cp37', 'none', 'macosx_10_13_x86_64'),
> >     …
> >      ('cp36', 'abi3', 'macosx_10_13_x86_64'),
> >     …
> >       ('cp35', 'abi3', 'macosx_10_13_x86_64'),
> >     …
> >       ('cp34', 'abi3', 'macosx_10_13_x86_64'),
> >     …
> >      ('cp33', 'abi3', 'macosx_10_13_x86_64'),
> >     …
> >      ('cp32', 'abi3', 'macosx_10_13_x86_64'),
> >     …
> >      ('py3', 'none', 'macosx_10_13_x86_64'),
> >     …
> >      ('cp37', 'none', 'any'),
> >      ('cp3', 'none', 'any'),
> >      ('py37', 'none', 'any'),
> >      ('py3', 'none', 'any'),
> >      ('py36', 'none', 'any'),
> >      ('py35', 'none', 'any'),
> >      ('py34', 'none', 'any'),
> >      ('py33', 'none', 'any'),
> >      ('py32', 'none', 'any'),
> >      ('py31', 'none', 'any'),
> >  ('py30', 'none', 'any')]
> >
> > So, it re-iterate the questions:
> >
> > What is ('pp3', 'none', 'any') supposed to represent for PyPy3? Since the
> > version of the interpreter is PyPy3 6.0 the lack of major version number
> > seems like a bug more than a purposeful interpreter version (and there's
> > only a single project -- cliquet -- that has a wheel that's compatible
> with
> > that tag triple and it's not even for their latest release).
> > Why does CPython have (*, 'none', 'any') from the version of the
> interpreter
> > down to Python 3.0 plus generically Python 3 while PyPy3 only gets
> generic
> > Python 3?
> > Why isn't (*, 'none', platform) listed from Python 3.7 to 3.0 for either
> > CPython or PyPy3? I understand not iterating through all versions when an
> > ABI is involved (without knowing exactly which versions are compatible
> like
> > abi3), but this triple seems safe to iterate through as a fallback just
> as
> > much as (*, 'none', 'any'). Maybe because it's too ambiguous to know how
> > important such a fallback would be between e.g. ('py36', 'none',
> > 'macosx_10_13_x86_64') and ('py37', 'none', 'any'), and so why bother
> when
> > the older version triples are there just for a safety net to have at
> least
> > some chance of a match?
> > I still think ('py360', 'none', 'any') is a bug. ;)
> >
> >
> > P.S.: The ('py3', 'none', 'macosx_10_13_x86_64') triple being between
> e.g.
> > ('pp360', 'none', 'macosx_10_13_x86_64') and ('pp360', 'none', 'any') is
> > really messing with my head and making the code to generate supported
> > triples a bit less elegant. ;)
> >
> > On Sat, 25 Aug 2018 at 15:03 Brett Cannon <br...@python.org> wrote:
> >>
> >> I noticed that for PyPy3, the tag triples considered compatible were
> >> (roughly; trimmed out the long list of macOS versions):
> >>
> >>     [('pp360', 'pypy3_60', 'macosx_10_13_x86_64'),
> >>      ('pp360', 'none', 'macosx_10_13_x86_64'),
> >>       ('py3', 'none', 'macosx_10_13_x86_64'),
> >>      ('pp360', 'none', 'any'),
> >>      ('pp3', 'none', 'any'),
> >>      ('py360', 'none', 'any'),
> >>      ('py3', 'none', 'any')]
> >>
> >> Now the first question I have is about ('pp3', 'none', 'any'). Is this
> >> meant to be a generic thing for any interpreter of the interpreter
> >> implementation and major version, or is this special to CPython and
> PyPy3?
> >>
> >> Question two is why isn't there a ('py35', 'none', 'any') or ('py34',
> >> 'none', 'any') and older to py30 after py3 like there is for CPython?
> Seems
> >> like if they are just source then they should be compatible as much as
> >> CPython.
> >>
> >> Question three is why isn't there a ('py35', 'none',
> >> 'macosx_10_13_x86_64') for PyPy3 or CPython 3.7? I can't figure out
> what a
> >> Python- and platform-specific wheel but agnostic to API wouldn't ever
> work?
> >>
> >> And I'm assuming ('py360', 'none', 'any'), isn't legitimate since that
> >> makes no sense. ;)
> >
> >
> > --
> > Distutils-SIG mailing list -- distutils-sig@python.org
> > To unsubscribe send an email to distutils-sig-le...@python.org
> > https://mail.python.org/mm3/mailman3/lists/distutils-sig.python.org/
> > Message archived at
> >
> https://mail.python.org/mm3/archives/list/distutils-sig@python.org/message/D7H47XWWDMOIUWODELQU27TGTC5KL6WY/
> >
>
>
>
> --
> Nathaniel J. Smith -- https://vorpus.org
>
--
Distutils-SIG mailing list -- distutils-sig@python.org
To unsubscribe send an email to distutils-sig-le...@python.org
https://mail.python.org/mm3/mailman3/lists/distutils-sig.python.org/
Message archived at 
https://mail.python.org/mm3/archives/list/distutils-sig@python.org/message/3K3NND564LI6HWF736QD4CTALE5UB6KU/

Reply via email to