Import name conflicts

Ben Finney ben+python at
Tue Apr 18 18:45:50 EDT 2017

Tim Johnson <tim at> writes:

> Using python 2.7~

In Python 2, you should turn on the “default import is absolute” by
issuing the statement::

    from __future__ import absolute_import

as one of the first statements in each module.

When you migrate your code to PYthon 3, that will be the default

> The packages is called 'controllers' and has a submodule named 'imp'

To avoid the module named ‘imp’ in the standard library, your code
should import ‘imp’ using a relative import. See PEP 328

So, you'd do::

    from . import imp

to import the ‘imp’ module relative to the current package.

> I do the following:
> >>> a = __import__('imp')

It is best to avoid calling dunder functions directly; they are
available for overriding the internals of language features, and
*invoking* one is best done by just using the corresponding language

Instead, use either the ‘import’ statement, or the ‘importlib’ standard
library module <URL:>,
specifically the ‘importlib.import_module’ function::

    import importlib

    a = importlib.import_module('.imp')

> Now, suppose a python upgrade provides a package called controllers or
> there's some great third-party package available called controllers.

You don't even have to imagine that far: there is already a standard
library module named ‘imp’, so you already have that problem to contend
with :-)

That is the distinction that led to “absolute” import versus “relative”

> How do I access the 'global' controllers package?

* Enable “default import is absolute”, as described above.

* Issue a normal import statement: the absolute import search path will
  be used.

I hope that helps.

 \      “[I]t is impossible for anyone to begin to learn that which he |
  `\                thinks he already knows.” —Epictetus, _Discourses_ |
_o__)                                                                  |
Ben Finney

More information about the Python-list mailing list