python - 模块导入结构是否应该避免将中间模块拖入更高的命名空间?如果是这样,怎么做?
问题描述
假设我有一个这样的模块:
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
。所以中间模块显然被拖到了命名空间中。是否应该避免这种情况,如果可以,如何避免。
解决方案
我在模块的init .py 中说 from .submodule import A, B。我从没说过。导入子模块。所以中间模块显然被拖到了命名空间中。是否应该避免这种情况,如果可以,如何避免。
什么都没有“拖入命名空间”,“子模块”是“模块”命名空间的一部分,因为“子模块”是“模块”的一部分,这就是为什么在模块的init中你可以这样做;“来自(DOT)子模块......”。
点转换为“来自 THISPACKAGE->submodule ...”
如果“子模块”不是“模块”包的一部分,那么您将无法从模块的init中的“模块”导入它。
推荐阅读
- r - 在闪亮的应用程序中将数据帧从外部函数传递到服务器
- azure - 指向 Azure 流量管理器的 Azure CDN 终结点
- javascript - Node.js 模块,函数未正确导出
- delphi - 如何防止程序在全屏触摸屏上运行时被关闭?
- firefox - 无法访问 Firefox 插件中的 urlbar
- java - 使视图覆盖android中的所有其他视图?
- javascript - 每次更新 React 中的输入或文本区域时,onChange 事件处理程序是否会重新呈现组件?
- postgresql - 在 pgAdmin 4 中使用 SQL 查询运行示例数据库时出错
- mysql - 如何根据表 2 中的更新值更新表 1
- c# - 使用 Post 发送数据类型 Json 时出错