首页 > 解决方案 > 模块导入结构是否应该避免将中间模块拖入更高的命名空间?如果是这样,怎么做?

问题描述

假设我有一个这样的模块:

module
├── __init__.py
└── submodule
    ├── B.py
    ├── __init__.py
    └── subsubmodule
        ├── A.py
        └── __init__.py

具有以下文件内容:

module/submodule/subsubmodule/A.py
    class A:
        pass

module/submodule/subsubmodule/__init__.py
    from .A import A

module/submodule/__init__.py
    from .subsubmodule import A
    from .B import B

module/submodule/B.py
    class B:
        pass

module/__init__.py
    from .submodule import A, B

当我导入模块时,我希望类AB在顶层立即可用。这就像我设置它的方式一样好。但我也最终submodulemodule. 为什么?这没问题还是有问题?在我看来它不干净。我可以避免这种情况吗?

In [1]: import module

In [2]: dir(module)
Out[2]: 
['A',
 'B',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__path__',
 '__spec__',
 'submodule'] # <------------ why is that here? 

from .submodule import A, B在中__init__.pymodule。我从来没有说过from . import submodule。所以中间模块显然被拖到了命名空间中。是否应该避免这种情况,如果可以,如何避免。

标签: pythonpython-3.ximportmodule

解决方案


我在模块的init .py 中说 from .submodule import A, B。我从没说过。导入子模块。所以中间模块显然被拖到了命名空间中。是否应该避免这种情况,如果可以,如何避免。

什么都没有“拖入命名空间”,“子模块”是“模块”命名空间的一部分,因为“子模块”是“模块”的一部分,这就是为什么在模块的init中你可以这样做;“来自(DOT)子模块......”。

点转换为“来自 THISPACKAGE->submodule ...”

如果“子模块”不是“模块”包的一部分,那么您将无法从模块的init中的“模块”导入它。


推荐阅读