[Distutils] wacky idea about reifying extras

Donald Stufft donald at stufft.io
Mon Oct 26 07:41:27 EDT 2015

On October 26, 2015 at 3:36:47 AM, Nathaniel Smith (njs at pobox.com) wrote:
> > TL;DR
> -----
> If we:
> - implement a real resolver, and
> - add a notion of a per-project namespace of distribution names,  
> that
> are collected under the same PyPI registration and come from  
> the same
> sdist, and
> - add Conflicts:, and Provides:,
> then we can elegantly solve a collection of important and difficult  
> problems, and we can retroactively pun the old extras system  
> onto the
> new system in a way that preserves 100% compatibility with all  
> existing packages.
> I think?
> What do you think?

My initial reaction when I started reading your idea was that I didn't see a
point in having something like foo[bar] be a "real" package when you could just
as easily have foo-bar. However, as I continued to read through the idea it
started to grow on me. I think I need to let it percolate in my brain a little
bit, but there may be a non-crazy (or at least, crazy in a good way) idea here
that could push things forward in a nice way.

Some random thoughts:

* Reusing the extra syntax is nice because it doesn't require end users to
  learn any new concepts, however we shouldn't take a new syntax off the table
  either if it makes the feature easier to implement with regards to backwards
  compatability. Something like numpy{mkl,some-other-thing} could work just as
  well too. We'll need to make sure that whatever symbols we choose can be
  represented on all the major FS we care about and that they are ideally non
  ugly in an URL too. Of course, the filename and user interface symbols don't
  *need* to match. It could just as easily example numpy[mkl] out to numpy#mkl
  or whatever which should make it easier to come up with a nice scheme.

* Provides is a bit of an odd duck, I think in my head I've mostly come to
  terms with allowing unrestricted Provides when you've already installed the
  package doing the Providing but completely ignoring the field when pulling
  data from a repository. Our threat model assumes that once you've selected to
  install something then it's generally safe to trust (though we still do try
  to limit that). The problem with Provides mostly comes into play when you
  will respect the Provides: field for any random package on PyPI (or any other

* The upgrade mess around extras as they stand today could also be solved just
  by recording what extras (if any) were selected to be installed so that we
  keep a consistent view of the world. Your proposal is essentially doing that,
  just by (ab)using the fact that by installing a package we essentially get
  that aspect of it for "free".

* Would this help at all with differentiating between SSE2 and SSE3 builds and
  things like that? Or does that need something more automatic to be really

* PEP 426 (I think it was?) has some extra syntax for extras which could
  probably be really nice here, things like numpy[*] to get *all* of the extras
  (though if they are real packages, what even is "all"?). It also included
  (though this might have been only in my head) default to installed packages
  which meant you could do something like split numpy into numpy[abi2] and
  numpy[abi3] packages and have the different ABIs actually contained within
  those other packages. Then you could have your top level package default to
  installing abi3 and abi2 so that ``pip install numpy`` is equivilant to
  ``pip install numpy[abi2,abi3]``. The real power there, is that people can
  trim down their install a bit by then doing ``pip install numpy[-abi2]`` if
  they don't want to have that on-by-default feature.

I'm going to roll through around in my head more, and hopefully more people
with other interesting problems to solve can chime in and say whether they
think this would solve their problems or not. My less-than-immediate reaction
now that I'm through the entire thing is that it seems like it could be good
and I'm struggling to think of a major downside.

Donald Stufft
PGP: 0x6E3CBCE93372DCFA // 7C6B 7C5D 5E2B 6356 A926 F04F 6E3C BCE9 3372 DCFA

More information about the Distutils-SIG mailing list