Если файл с именем __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
все еще может присутствовать, если требуется инициализация пакета.