[Import-SIG] Where to discuss PEP 382 vs. PEP 402 (namespace packages)?
Nick Coghlan
ncoghlan at gmail.com
Mon Mar 12 01:58:01 CET 2012
On Mon, Mar 12, 2012 at 9:02 AM, Guido van Rossum <guido at python.org> wrote:
> Martin has asked me to decide on PEP 382 vs. PEP 402 (namespace
> packages) in time for inclusion of the decision in Python 3.3. As
> people who attended the language-sig know, I am leaning towards PEP
> 402 but I admit that at this point I don't have enough information. If
> I have questions, should I be asking them on the import-sig or on
> python-dev?
I agree with the others that import-sig is the right place.
> Is it tolerable if I ask questions even if the answer is
> somewhere in the archives? (I spent a lot of time reviewing the
> "pitchfork thread",
> http://mail.python.org/pipermail/python-dev/2006-April/064400.html,
> but that wasn't particularly fruitful, so I'm worried I'd just waste
> my time browsing the archives -- if the PEP authors did their jobs
> well the PEPs should include summaries of the discussion anyways.)
When PJE first proposed PEP 402 I was a fan, but I changed my mind
once I realised it was fundamentally incompatible with PEP 395 (where
I want to fix the way we initialise sys.path[0] so that direct
execution of modules inside packages isn't broken).
With the status quo or PEP 382's explicit namespace packages, the
interpreter can look at the *filesystem* to figure out where the root
directory of the package lives, as the explicit package markers (i.e.
__init__.py files or *.pyp extensions) mean there is an unambiguous
1:1 mapping from a filesystem path to a (sys.path entry, module
reference) pair.
With PEP 402, however, the filesystem layout becomes ambigous - you
*can't* derive the appropriate sys.path entry from the filesystem any
more, because the meaning of the filesystem layout *depends on* what
you put in sys.path.
To give a simple example:
Status quo:
myproject/
__init__.py
__main__.py
module.py
tests/
__init__.py
test_module.py
Clearly, "myproject" is a Python package with "myproject.module" and
"myproject.tests.test_module" as the contents. Only the parent
directory of "myproject" should be placed on sys.path. The package can
be executed as a script via "python -m myproject".
PEP 382:
myproject.pyp/
__main__.py
module.py
tests.pyp/
test_module.py
No real change from the status quo - the "__init__.py" marker files
are simply replaced by the "*.pyp" marker extension.
PEP 402:
myproject/
__main__.py
module.py
tests/
test_module.py
Uh-oh, now we have a problem. This is either an executable directory
(designed to be run as "python myproject" and providing a top-level
"module" and "tests.test_module") or an executable package (designed
to be run as "python -m myproject" and providing "myproject.module"
and "myproject.tests.test_module"). Because the filesystem layout is
ambiguous, there's no way for the interpreter to figure out what the
developer meant and we'd be stuck with the current broken* sys.path[0]
initialisation forever.
I've described the implications of the two namespace PEPs briefly in
PEP 395, which also has links to the relevant import-sig threads:
http://www.python.org/dev/peps/pep-0395/#compatibility-with-pep-382
http://www.python.org/dev/peps/pep-0395/#incompatibility-with-pep-402
*PEP 395 also explains my rationale for calling our current
sys.path[0] initialisation mechanism broken:
http://www.python.org/dev/peps/pep-0395/#why-are-my-imports-broken
Cheers,
Nick.
--
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
More information about the Import-SIG
mailing list