Сообщить об ошибке.

Файл пакета __init__.py

Инициализация пакета с модулями

Если файл с именем __init__.py присутствует в каталоге пакета, то он вызывается при импорте пакета или модуля в пакете. Это может быть использовано для выполнения кода инициализации пакета, например инициализации данных уровня пакета.

Поместим следующий код в файл __init__.py:

print(f'Файл __init__.py в пакете {__name__}')
var_init = ['one', 'two', 'three']

Добавим файл __init__.py в каталог pkg из примера "Пакеты модулей в Python":

-- pkg 
    |
    |---- __init__.py
    |
    |---- mod1.py
    |
    |---- mod2.py

Теперь при импорте пакета инициализируется глобальная переменная var_init:

>>> import pkg
# Файл __init__.py в пакете pkg
>>> pkg.var_init
# ['one', 'two', 'three']

Модуль в пакете может получить доступ к глобальным переменным пакета файла __init__.py, импортируя его в свою очередь. Изменим файл модуля пакета mod1.py следующим образом:

mod1.py:

def foo():
    from pkg import var_init
    print('Модуль 1, функция foo(), var_init =', var_init)
>>> from pkg import mod1
# Вызов __init__.py в пакете pkg

>>> mod1.foo()
# Модуль 1, функция foo(), var_init = ['one', 'two', 'three']

Файл __init__.py может также использоваться для автоматического импорта модулей пакета. В материале "Пакеты модулей в Python" говорилось, что оператор import pkg помещает только имя пакета pkg в область видимости вызывающего объекта и не импортирует никакие модули. Изменим файл пакета __init__.py в каталоге pkg, дописав строку импорта модулей import pkg.mod1, pkg.mod2.

__init__.py:

print(f'Файл __init__.py в пакете {__name__}')
x = ['one', 'two', 'three']
import pkg.mod1, pkg.mod2

Теперь при импорте пакета pkg, модули в mod1 и mod2 импортируются автоматически:

>>> import pkg
# Файл __init__.py в пакете pkg
>>> pkg.mod1.foo()
# Модуль 1, функция foo(), var_init = ['one', 'two', 'three']
>>> pkg.mod2.bar()
# Модуль 2, функция bar()

Примечание: большая часть статей про пакеты в Python утверждает, что файл __init__.py должен присутствовать в каталоге пакета при его создании. До версии Python 3.3 это было правдой. Само присутствие файла __init__.py означало для Python, что пакет был определен. Файл мог содержать код инициализации или даже быть пустым, но он должен был присутствовать.

Начиная с Python 3.3, были введены неявные пространств имен пакета, что позволяют создать пакет без каких-либо __init__.py файлов. Конечно, файл __init__.py все еще может присутствовать, если требуется инициализация пакета.