Эффективно импортируйте имена из многих подмодулей пакета - PullRequest
0 голосов
/ 10 июня 2018

У меня есть следующая структура файлов

| 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

Но у меня уже есть большой список подмодулей, и он выглядит неправильно ...

1 Ответ

0 голосов
/ 10 июня 2018

Возможно, самый управляемый способ - вообще не использовать 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(<...>)

С этой логикой вы все еще можете сократить ввод 1023 *, набрав from APIs import *, получив submodule1, submodule2 и т. Д. В свое пространство имен, котороеможет быть достаточно, чтобы «мгновенно увидеть, что происходит откуда», если имена подмодулей достаточно уникальны.


Наконец, вы можете уменьшить повторение кода:

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

Но это затруднит поиск рефералапересекает через кодовую базу.Таким образом, весь импорт в упаковке выглядит предпочтительнее, потому что это нужно сделать только один раз.

...