模块导入结构是否应该避免将中间模块拖到更高的命名空间中?如果是这样,怎么办?

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


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

当我导入模块时,我希望类A和B立即在顶层可用。按照我设置的方式,效果很好。但我最终还是submodule在module. 为什么?这是可以还是有问题?对我来说它看起来不干净。我可以避免这种情况吗?


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__.py的module。我从来没有说过from . import submodule。所以中间模块显然被拖到了命名空间中。是否应该避免这种情况,如果是的话如何避免。


慕婉清6462132
浏览 89回答 1
1回答

临摹微笑

我在模块的init.py中说了from .submodule import A, B。我从来没有说过从。导入子模块。所以中间模块显然被拖到了命名空间中。是否应该避免这种情况,如果是的话如何避免。没有什么是“拖入命名空间”的,“子模块”是“模块”命名空间的一部分,因为“子模块”是“模块”的一部分,这就是为什么在模块的init中你可以这样做;“来自(DOT)子模块..”。该点翻译为“来自 THISPACKAGE->子模块...”如果“子模块”不是“模块”包的一部分,那么您将无法从模块的init内的“模块”导入它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python