Fix Python – Changes in import statement python3


Asked By – balki

I don’t understand the following from pep-0404

In Python 3, implicit relative imports within packages are no longer
available – only absolute imports and explicit relative imports are
supported. In addition, star imports (e.g. from x import *) are only
permitted in module level code.

What is a relative import?
In what other places star import was allowed in python2?
Please explain with examples.

Now we will see solution for issue: Changes in import statement python3


Relative import happens whenever you are importing a package relative to the current script/package.

Consider the following tree for example:


Now, your requires something from In Python 2, you could do it like this (in

from base import BaseThing

Python 3 no longer supports that since it’s not explicit whether you want the ‘relative’ or ‘absolute’ base. In other words, if there was a Python package named base installed in the system, you’d get the wrong one.

Instead it requires you to use explicit imports which explicitly specify location of a module on a path-alike basis. Your would look like:

from .base import BaseThing

The leading . says ‘import base from module directory’; in other words, .base maps to ./

Similarly, there is .. prefix which goes up the directory hierarchy like ../ (with ..mod mapping to ../, and then ... which goes two levels up (../../ and so on.

Please however note that the relative paths listed above were relative to directory where current module ( resides in, not the current working directory.

@BrenBarn has already explained the star import case. For completeness, I will have to say the same ;).

For example, you need to use a few math functions but you use them only in a single function. In Python 2 you were permitted to be semi-lazy:

def sin_degrees(x):
    from math import *
    return sin(degrees(x))

Note that it already triggers a warning in Python 2: SyntaxWarning: import * only allowed at module level
  def sin_degrees(x):

In modern Python 2 code you should and in Python 3 you have to do either:

def sin_degrees(x):
    from math import sin, degrees
    return sin(degrees(x))


from math import *

def sin_degrees(x):
    return sin(degrees(x))

This question is answered By – Michał Górny

This answer is collected from stackoverflow and reviewed by FixPython community admins, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0