为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕婉清6462132 2023-12-20 19:48:48
假设我有一个这样的模块:module├── __init__.py└── submodule    ├── B.py    ├── __init__.py    └── subsubmodule        ├── A.py        └── __init__.py具有以下文件内容:module/submodule/subsubmodule/A.py    class A:        passmodule/submodule/subsubmodule/__init__.py    from .A import Amodule/submodule/__init__.py    from .subsubmodule import A    from .B import Bmodule/submodule/B.py    class B:        passmodule/__init__.py    from .submodule import A, B当我导入模块时,我希望类A和B立即在顶层可用。按照我设置的方式,效果很好。但我最终还是submodule在module. 为什么?这是可以还是有问题?对我来说它看起来不干净。我可以避免这种情况吗?In [1]: import moduleIn [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。所以中间模块显然被拖到了命名空间中。是否应该避免这种情况,如果是的话如何避免。
查看完整描述

1 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

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

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

该点翻译为“来自 THISPACKAGE->子模块...”

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


查看完整回答
反对 回复 2023-12-20
  • 1 回答
  • 0 关注
  • 47 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信