Python - 来自 .进口
Python - from . import
我第一次接触图书馆,我注意到解决图书馆内部导入问题的最简单方法是使用如下结构:
from . import x
from ..some_module import y
这让我印象深刻,因为 'bad.' 也许这只是我不记得经常看到它的事实,尽管公平地说我还没有在大量图书馆中闲逛。
只是想看看这是否被认为是好的做法,如果不是,更好的方法是什么?
一切都有 PEP。
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.py
或 subpackage1/__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
但是变得不那么冗长或不那么明确很可能会给您或其他人带来麻烦。
我第一次接触图书馆,我注意到解决图书馆内部导入问题的最简单方法是使用如下结构:
from . import x
from ..some_module import y
这让我印象深刻,因为 'bad.' 也许这只是我不记得经常看到它的事实,尽管公平地说我还没有在大量图书馆中闲逛。
只是想看看这是否被认为是好的做法,如果不是,更好的方法是什么?
一切都有 PEP。
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.py
或 subpackage1/__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
但是变得不那么冗长或不那么明确很可能会给您或其他人带来麻烦。