繁体   English   中英

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

[英]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(),它是子模块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 *进行输入APIs ,将submodule1submodule2等放入您的命名空间中,如果子模块名称足够唯一,则足以“立即查看来自何处的东西”。


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

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

但这将使得在整个代码库中搜索引用变得更加困难。 因此,在包中进行所有导入看起来都是可取的,因为只需要执行一次即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM