Я испытываю затруднения при понимании сценариев использования или целей дизайна Python __init__.py
файлы в моих проектах.
Предположите, что у меня есть 'образцовый' каталог (относится как пакет), который содержит следующие файлы
__init__.py
meta.py
solrmodel.py
mongomodel.py
samodel.py
Я нашел два способа использовать __init__.py
:
Я имею распространенный определение, которое должно использоваться в solrmodel.py
, mongomodel.py
, samodel.py
. Я могу использовать __init__.py
как основное/распространенное определение для весь *model.py классы? Это означает, что я должен импортировать model/__init__.py
.
Или, __init__.py
импортирую определения solrmodel.py, mongomodel.py, samodel.py в ее собственном, и он позволяет легкий импорт классов или функции как это:
# file: __init__.py
from mongomodel import *
from solrmodel import *
from samodel import *
(Я знаю это import *
не рекомендуется и я просто использовал его в качестве конвенции),
Я не мог решить между вышеупомянутыми двумя сценариями. Есть ли больше сценариев использования для __init__.py
и можно ли объяснить использование?
Подавляющее большинство файлов __ init __. Py
, которые я пишу, пусты, потому что многим пакетам нечего инициализировать.
Один из примеров, в котором мне может потребоваться инициализация, - это когда во время загрузки пакета я хочу раз и навсегда прочитать кучу данных (например, из файлов, БД или Интернета) - и в этом случае гораздо лучше поместить это чтение в частную функцию в __ init __. Py
пакета, чем иметь отдельный «модуль инициализации» и избыточно импортировать этот модуль из каждого отдельного реального модуля в пакете (бесполезно повторяющийся и подверженный ошибкам: это, очевидно, тот случай, когда полагаться на гарантию языка, что пакет __ init __. py
будет загружен один раз, прежде чем какой-либо модуль в пакете, очевидно, намного больше Pythonic!) .
Чтобы узнать другие конкретные и авторитетные мнения, посмотрите на различные подходы, используемые в различных пакетах, которые являются частью стандартной библиотеки Python.
Содержимое __ init __. Py
импортируется, когда вы импортируете модуль внутри пакета.
Вы упускаете из виду третий сценарий, заключающийся в том, чтобы поместить общие части в отдельный модуль, а затем импортировать другие модули, оставив __ init __. Py
для вещей, которые будут использоваться вне пакета. . Я обычно следую этой практике.