import in Python3.3

rocky rocky at gnu.org
Tue Mar 26 04:49:06 CET 2013


On Sunday, March 24, 2013 8:27:56 PM UTC-4, Steven D'Aprano wrote:
> On Sun, 24 Mar 2013 18:12:49 -0500, Fabian von Romberg wrote:
> 
> 
> 
> > Hi,
> 
> > 
> 
> > I have a package name collections and inside of my package I want to
> 
> > import the collections package from the standard library, but there is
> 
> > name conflicts.
> 
> > 
> 
> > How do I import explicitly from the standard library?
> 
> 
> 
> You can't. However, you can import explicitly from your package, or 
> 
> implicitly by using a relative import.
> 
> 
> 
> Starting from Python 2.7, the "import" statement is always absolute. So 
> 
> the line:
> 
> 
> 
>   import collections
> 
> 
> 
> will always find the first *top level* module or package "collections" in 
> 
> the python search path. See below for an important proviso.
> 
> 
> 
> Inside your package, you can either use an explicit import like this:
> 
> 
> 
>   import mypackage.collections as collections
> 
> 
> 
> or use a relative import like this:
> 
> 
> 
>   from . import collections
> 
> 
> 
> Here is a concrete example. I create a package containing five files:
> 
> 
> 
> mypackage/
> 
> +-- __init__.py
> 
> +-- collections.py
> 
> +-- absolute_import.py
> 
> +-- explicit_import.py
> 
> +-- relative_import.py
> 
> 
> 
> with the following content:
> 
> 
> 
> # absolute_import.py
> 
> import collections
> 
> 
> 
> # explicit_import.py 
> 
> import mypackage.collections as collections
> 
> 
> 
> # relative_import.py 
> 
> from . import collections
> 
> 
> 
> 
> 
> The other two files (collections.py and __init__.py) can be blank. Now, 
> 
> from *outside* the package, I can do this:
> 
> 
> 
> 
> 
> py> import mypackage.absolute_import
> 
> py> import mypackage.explicit_import
> 
> py> import mypackage.relative_import
> 
> py> 
> 
> py> mypackage.absolute_import.collections
> 
> <module 'collections' from '/usr/local/lib/python3.3/collections/__init__.py'>
> 
> py> mypackage.explicit_import.collections
> 
> <module 'mypackage.collections' from './mypackage/collections.py'>
> 
> py> mypackage.relative_import.collections
> 
> <module 'mypackage.collections' from './mypackage/collections.py'>
> 
> 
> 
> 
> 
> Of course "from mypackage import absolute_import" etc. will also work.
> 
> 
> 
> 
> 
> However, beware: if you cd into the package directory, and then launch 
> 
> Python, the current directory will contain a file "collections.py" which 
> 
> will shadow the standard library collections.py. So don't do that.

I find this kind of thing sad: it feels to me that programmers are working around somewhat arbitrary and changing restrictions. Rather than avoid names like "collections", why not try to address the underlying problem? There isn't an ambiguity here in my view: the fullname is mypackage.collections

It was for this reason I wrote import_relative http://code.google.com/p/pyimport-relative/. 

It is far from perfect, but it pleases me to think that I one can adjust the language to do reasonable things rather than having it bend me into figuring out what's out there and limit the choice of names I use in submodules. 

> 
> 
> 
> 
> 
> 
> 
> -- 
> 
> Steven




More information about the Python-list mailing list