Python相对导入有两个以上的点

Iva*_*hko 7 python coding-style python-import python-3.4

可以使用在路径中引用两个以上点的模块吗?像这个例子:

# 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.
Run Code Online (Sandbox Code Playgroud)

UPD:更改了示例。我知道,这将在实践中起作用。但这是一种常见的导入方法吗?

Hui*_*ang 5

2020年11月24日更新

如果你想深入了解 python 的相对导入,我强烈推荐你这个答案


是否可以使用路径中包含两个以上点的模块引用?

是的。相对导入路径中可以使用多个点,但只有在使用from xxx import yyy语法时才可行,而不是import xxx语法。另外,单点、两点、三点分别表示当前目录、父目录、祖目录,以此类推。

我知道,这在实践中会起作用。但这是不是一种常见的导入方法呢?

这取决于。如果你的项目有复杂的目录结构,使用绝对导入会“令人恶心”。例如,

from sub1.sub2.sub3.sub4.sub5 import yourmethod
Run Code Online (Sandbox Code Playgroud)

。在这种情况下,使用相对导入将使您的代码干净整洁。也许看起来像

from ...sub5 import yourmethod
Run Code Online (Sandbox Code Playgroud)


小智 4

来自PEP8

建议绝对导入,因为如果导入系统配置不正确(例如当包内的目录以 结尾时),它们通常更具可读性并且往往表现更好(或至少给出更好的错误消息)sys.path

import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example
Run Code Online (Sandbox Code Playgroud)

然而,显式相对导入是绝对导入的可接受替代方案,特别是在处理复杂的包布局时,使用绝对导入会不必要地冗长:

from . import sibling
from .sibling import example
Run Code Online (Sandbox Code Playgroud)

标准库代码应避免复杂的包布局并始终使用绝对导入。

  • 我读过。但没有提及超过两个点的相对导入。在示例[此处](http://stackoverflow.com/questions/14767426/relative-imports)和一些第三方Python包中,它看起来倾向于使用相对导入。 (9认同)