Python - 来自 .进口

Python - from . import

我第一次接触图书馆,我注意到解决图书馆内部导入问题的最简单方法是使用如下结构:

from . import x
from ..some_module import y

这让我印象深刻,因为 'bad.' 也许这只是我不记得经常看到它的事实,尽管公平地说我还没有在大量图书馆中闲逛。

只是想看看这是否被认为是好的做法,如果不是,更好的方法是什么?

一切都有 PEP。

引用自PEP8: Imports

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:

Guido's decision in PEP328 导入:多行和 Absolute/Relative

从 PEP328 复制意大利面

这是一个示例包布局:

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py

假设当前文件是 moduleX.pysubpackage1/__init__.py ,以下都是新语法的正确用法:

from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
from ...package import bar
from ...sys import path

显式优于隐式。至少根据 python.

的禅宗

我发现使用 .基于导入会造成混淆,尤其是当您在许多库中构建或工作时。如果我不完全了解包结构,那么这种方式的来源就不那么明显了。

如果有人想做一些类似于(但不相同)我在我的库模块中所做的事情,如果在导入中指定了完整的包结构,人们可以复制并粘贴导入行。

使用点进行重构和重组更加困难,因为如果您在包结构中移动模块或将模块移动到不同的包,它们将意味着不同的东西。

如果你想方便地访问你的包中的某些东西,其他人可能会这样做,所以你最好通过构建一个好的库来解决这个问题,而不是依靠语言来将你的导入行保持在 80 个字符以下.在这些情况下,如果您有一个包 mypackage,子包 stuff,模块 things 和 class Whatever 需要在您的代码和用户中频繁导入代码,您可以将导入到 __init__.py for mypackage:

__all__ = ['Whatever']
from mypackage.stuff.things import Whatever

然后你和任何想使用 Whatever 的人都可以这样做:

from mypackage import Whatever

但是变得不那么冗长或不那么明确很可能会给您或其他人带来麻烦。