[Import-SIG] New PEP draft: "Simplified Package Layout and Partitioning"

P.J. Eby pje at telecommunity.com
Tue Jul 19 00:49:23 CEST 2011

At 12:17 PM 7/18/2011 -0400, Barry Warsaw wrote:
>1. Sometimes, packages can have non-importable data directories,
>    e.g. foo/test/data.  Where foo.test would be an importable subpackage,
>    foo.test.data should not be.  Today we can just omit the __init__.py from
>    foo/test/data.  Under the proposed regime there would IIUC, be no way to
>    prevent foo.test.data from being a subpackage.  It's entirely 
> possible that
>    foo/test/data would have .py files in it which would themselves be
>    importable.  Is this a bad thing?

Why would it be?

>If so, do we need some mechanism to
>    prevent recursion into some subdirectories?

You could rename the subdirectory, I suppose.

>2. The __file__ issue.  My gut tells me that pure virtual modules should have
>    None as their __file__.  It seems wrong to use anything else, and your
>    "accidentally work" observation is not calming. ;)

Heh.  ;-)

>    The inability to use __file__ to find data files is somewhat troubling
>    though.  Let's say we want to find the foo/test/data subdir above, and
>    `foo` is pure-virtual, while `test` is an __init__.py-less package.
>    I'm fine not being able to use foo.__file__, but I will probably want to
>    use `os.path.join(foo.test.__file__, 'data')`.

Currently, you'd actually join to the dirname() of the __file__, not 
the plain file.  Thus, putting a directory name with a trailing '/' 
in __file__ would then make the current incantation work for that 
case, as long as you were fine with looking in the *first* directory 
where the file was.

However, I'm not as keen on that as a general solution, simply 
because if you add a 'foo/test.py', then the __file__ will change 
such that a different incantation is required to find the directory.

>   Will that work?  What would
>    foo.test's __file__ be?  The `foo/test` directory perhaps?  Of 
> course there
>    could be multiple `foo/test` directories, so this is probably why your
>    suggesting to search foo.test.__path__ instead.
>    I'd actually be okay with that, *if* pkg_resources will be updated to
>    handle this case.  In general, we've been recommending people use
>    pkg_resources anyway (wasn't there a push to move part of this 
> package into
>    the stdlib?).

pkg_resources says not to use a namespace package as your target for 
a lookup, but instead to always use a self-contained package or a 
module that's adjacent to what you're looking for, for this very 
reason.  There's really no change here.

>I'll read up on the rest of the thread now, but I think the PEP holds up well
>and makes a convincing argument.  I think it's certainly worthy of posting to
>python-dev to see if anybody else can shoot holes in it, or come up with
>useful solutions to open questions.  I'll be very interested to see Guido's
>reaction to it. :)

Me too.  ;-)

More information about the Import-SIG mailing list