использование __ init __. py

Я испытываю затруднения при понимании сценариев использования или целей дизайна Python __init__.py файлы в моих проектах.

Предположите, что у меня есть 'образцовый' каталог (относится как пакет), который содержит следующие файлы

  1. __init__.py
  2. meta.py
  3. solrmodel.py
  4. mongomodel.py
  5. samodel.py

Я нашел два способа использовать __init__.py:

  1. Я имею распространенный определение, которое должно использоваться в solrmodel.py, mongomodel.py, samodel.py. Я могу использовать __init__.py как основное/распространенное определение для весь *model.py классы? Это означает, что я должен импортировать model/__init__.py.

  2. Или, __init__.py импортирую определения solrmodel.py, mongomodel.py, samodel.py в ее собственном, и он позволяет легкий импорт классов или функции как это:

    # file: __init__.py
    
    from mongomodel import *
    from solrmodel import *
    from samodel import *
    

    (Я знаю это import * не рекомендуется и я просто использовал его в качестве конвенции),

Я не мог решить между вышеупомянутыми двумя сценариями. Есть ли больше сценариев использования для __init__.py и можно ли объяснить использование?

65
задан Gewthen 16 October 2015 в 23:01
поделиться

2 ответа

Подавляющее большинство файлов __ init __. Py , которые я пишу, пусты, потому что многим пакетам нечего инициализировать.

Один из примеров, в котором мне может потребоваться инициализация, - это когда во время загрузки пакета я хочу раз и навсегда прочитать кучу данных (например, из файлов, БД или Интернета) - и в этом случае гораздо лучше поместить это чтение в частную функцию в __ init __. Py пакета, чем иметь отдельный «модуль инициализации» и избыточно импортировать этот модуль из каждого отдельного реального модуля в пакете (бесполезно повторяющийся и подверженный ошибкам: это, очевидно, тот случай, когда полагаться на гарантию языка, что пакет __ init __. py будет загружен один раз, прежде чем какой-либо модуль в пакете, очевидно, намного больше Pythonic!) .

Чтобы узнать другие конкретные и авторитетные мнения, посмотрите на различные подходы, используемые в различных пакетах, которые являются частью стандартной библиотеки Python.

50
ответ дан 24 November 2019 в 15:31
поделиться

Содержимое __ init __. Py импортируется, когда вы импортируете модуль внутри пакета.

Вы упускаете из виду третий сценарий, заключающийся в том, чтобы поместить общие части в отдельный модуль, а затем импортировать другие модули, оставив __ init __. Py для вещей, которые будут использоваться вне пакета. . Я обычно следую этой практике.

23
ответ дан 24 November 2019 в 15:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: