используя __init__.py - PullRequest
62 голосов
/ 02 марта 2010

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

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

  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 и можете ли вы объяснить использование?

Ответы [ 2 ]

48 голосов
/ 02 марта 2010

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

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

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

23 голосов
/ 02 марта 2010

Содержимое __init__.py импортируется при импорте модуля в пакете.

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

...