[Distutils] namespace_packages: include itself ot not include

P.J. Eby pje at telecommunity.com
Tue Feb 8 00:16:14 CET 2011

At 12:06 AM 2/8/2011 +0300, Roman Kurakin wrote:
>but one is initial provider of 'aaa' share
>and other consumer of 'aaa' share.

This statement is why you're confused.  A namespace is not "provided" 
by anyone, only participated in.

Think of it this way.  You and I decide to have lunch together.  I am 
not providing the lunch.  You are not providing the lunch.  But we 
are both participating in the lunch.

That is how namespace packages work.  aaa.bbb participates in the aaa 
namespace, therefore it lists aaa as a namespace package.

Better, a concrete example.  zope.interface participates in the zope 
namespace package, so it lists 'zope' in namespace_packages.  There 
is no "zope" package that stands by itself, there are only zope.* 
packages that together participate in the zope namespace.

>Why 'aaa.bbb' should even know that there is, or
>will be any other, for example 'aaa.bbb.ccc'?

It would only do this if you indeed planned to have that happen.

For example, I have a 'peak.util' namespace package.  There are many 
projects, such as DecoratorTools, Importing, and so forth on PyPI 
that provide modules in that namespace.  DecoratorTools is 
peak.util.decorators, Importing is peak.util.imports, and so on.

There is NO peak.util package, however.  You cannot download 
peak.util someplace, because it is a *namespace* package.

The entire point of a namespace package is that it's just a name, and 
NOT an actual package.  You would never import anything directly from 
peak.util, because it's just a place where other packages live.

"peak" is also a namespace package, and there are other projects that 
contribute modules and subpackages to that namespace.

>In a simple case 'shared' is a little bit confusing in case we are 'extending'
>namespace via strict hierarchy aaa.bbb, aaa.ccc, aaa.bbb.ddd etc. Where
>any of packages are initial providers of their own namespaces. 'aaa' and
>'aaa.bbb' share 'aaa' namespace, but one is initial provider of 'aaa' share
>and other consumer of 'aaa' share.

Namespace packages don't work like that.  All participants in a 
namespace are *equal peers*, not "base plus extensions".

Sure, you can DO it, but the tools don't have any notion that one 
package is the base and another is the extender.  That's why you're 
getting confused: you are thinking "base and extension", but 
namespace packages are peer-to-peer.  You participate in a namespace 
by having some code that goes in it, and EVERY project that 
participates in that namespace must declare it -- no exceptions.

(If a project doesn't declare the namespace, and it ends up first on 
sys.path, it will block access to all the other participants in the 
same namespace.)

More information about the Distutils-SIG mailing list