有效地从包的许多子模块导入名称
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 *
、将 submodule1
、submodule2
等输入您的命名空间来减少输入 APIs
,这可能足以 "instantly see what comes from where" 如果子模块名称足够独特。
最后,您可以减少代码重复:
import importlib
for module in ('submodule1','submodule2',<...>):
vars()[module] = importlib.import_module(module,'APIs')
del module, importlib
但这将使跨代码库搜索引用变得更加困难。因此,在包中进行所有导入看起来更可取,因为它只需要完成一次。
我有以下文件结构
| 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 *
、将 submodule1
、submodule2
等输入您的命名空间来减少输入 APIs
,这可能足以 "instantly see what comes from where" 如果子模块名称足够独特。
最后,您可以减少代码重复:
import importlib
for module in ('submodule1','submodule2',<...>):
vars()[module] = importlib.import_module(module,'APIs')
del module, importlib
但这将使跨代码库搜索引用变得更加困难。因此,在包中进行所有导入看起来更可取,因为它只需要完成一次。