import in Python3.3

Steven D'Aprano steve+comp.lang.python at pearwood.info
Sun Mar 24 20:27:56 EDT 2013


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.



-- 
Steven



More information about the Python-list mailing list