有效地从包的许多子模块导入名称

Import names from many submodules of a package efficiently

我有以下文件结构

| main.py
| Apis
|--| __init__.py
   | submodule1
   |--| __init__.py
   |--| Main.py
   | submodule2
   |--| __init__.py
   |--| Main.py

在每个 Main.py 文件中,我都有一个 main() 函数,它是子模块的主函数。 如何正确导入这些函数?

我目前做的是

from APIs.submodule1.Main import main as submodule1
from APIs.submodule2.Main import main as submodule2

但是我已经有了一大堆子模块,但它看起来不对...

可以说,最易于管理的方法是根本不使用 from ... import

import APIs.submodule1
import APIs.submodule2

<...>
APIs.submodule1.main(<...>)

我更喜欢这种方式,因为它允许我在稍后浏览此代码时立即看到来自哪里的内容。


如果有很多子模块要导入,包的__init__.py () 中的逻辑可以导入它们,以免在每个程序中重复该代码:

APIs\__init__.py:

import .submodule1   #or import just `main's instead if you don't need anything else
import .submodule2
<...>

如果您只导入包,无论您在此处放入包的命名空间中,都将在其中看到:

your_program.py:

import APIs
<...>
APIs.submodule1.main(<...>)

按照这个逻辑,您仍然可以通过执行 from APIs import *、将 submodule1submodule2 等输入您的命名空间来减少输入 APIs,这可能足以 "instantly see what comes from where" 如果子模块名称足够独特。


最后,您可以减少代码重复:

import importlib
for module in ('submodule1','submodule2',<...>):
    vars()[module] = importlib.import_module(module,'APIs')
del module, importlib

但这将使跨代码库搜索引用变得更加困难。因此,在包中进行所有导入看起来更可取,因为它只需要完成一次。