P.J. Eby wrote:
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.
No I am confused by practice :-) . The problem I am thinking about is
__init__.py.
So __init__.py is my namespace provider I thinking of beside the scene. The
problem I hit was with rpm packages I was playing with. The package
'aaa.bbb'
list itself in namespace_packages and developer states that this is
needed cause
there is 'aaa.bbb.ccc' package. In this case, installer drops
__init__.py not only
for aaa/__init__.py but also for aaa/bbb/__init__.py. For 'aaa' this is
correct
since some one should provide __init__.py for 'aaa' before us. But who will
provide __init__.py for 'aaa.bbb' if we pack it as setuptool provided it
for us?
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.
But what about 'aaa.bbb' that lists itself as a namespace package?
Should it list itself or not? In case it should, the question is how to
deal with __init__.py?
That is why I tried to draw such model with providers and extenders.
One should make reservation if lunch is planned in some popular place.
rik
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.)
_______________________________________________
Distutils-SIG maillist - [email protected]
http://mail.python.org/mailman/listinfo/distutils-sig