Ivan Velichko
Ivan Velichko

Reputation: 6719

Python relative import with more than two dots

Is it ok to use a module referencing with more than two dots in a path? Like in this example:

# Project structure:
# sound
#     __init__.py
#     codecs
#         __init__.py
#     echo
#         __init__.py
#         nix
#             __init__.py
#             way1.py
#             way2.py

# way2.py source code
from .way1 import echo_way1
from ...codecs import cool_codec

# Do something with echo_way1 and cool_codec.

UPD: Changed the example. And I know, this will work in a practice. But is it a common method of importing or not?

Upvotes: 14

Views: 16951

Answers (2)

go1dshtein
go1dshtein

Reputation: 315

From PEP8:

Absolute imports are recommended, as they are usually more readable and tend to be better behaved (or at least give better error messages) if the import system is incorrectly configured (such as when a directory inside a package ends up on sys.path):

import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example

However, explicit relative imports are an acceptable alternative to absolute imports, especially when dealing with complex package layouts where using absolute imports would be unnecessarily verbose:

from . import sibling
from .sibling import example

Standard library code should avoid complex package layouts and always use absolute imports.

Upvotes: 4

HuihuangZhang
HuihuangZhang

Reputation: 129

update Nov. 24,2020

If you wanna dig deeper in python's relative-import, I strongly recommend you this answer.


Is it ok to use a module referencing with more than two dots in a path?

Yes. You can use multiple dots in relative import path, but it is only feasible when using from xxx import yyy syntax, not import xxx syntax. Moreover, single dot, two dots and three dots mean current directory, parent directory and grandparent directory respectively, and so on.

And I know, this will work in a practice. But is it a common method of importing or not?

It depends. If your project has complex directory structure, using absolute import would be "disgusting". For example,

from sub1.sub2.sub3.sub4.sub5 import yourmethod

. In this case, using relative import will make your code clean and neat. Maybe look like

from ...sub5 import yourmethod

Upvotes: 5

Related Questions