Если переменная с именем varname
определена в модуле __init__.py
пакета с именем package
, то мы можем получить доступ к varname
следующим образом:
from package import varname
print(varname)
Аналогично,если переменная с именем varname
определена в модуле __init__.py
подпакета с именем subpackage
пакета с именем package
, то мы можем получить доступ к varname
следующим образом:
from package.subpackage import varname
print(varname)
Чтобы получить доступ к ним обоим одновременно, мы должны позаботиться о конфликте имен:
from package import varname as package_varname
from package.subpackage import varname as package_subpackage_varname
print(package_varname)
print(package_subpackage_varname)
Кроме того, __init__.py
позволяет нам определять любую переменную на уровне пакета. Это часто удобно, если модуль определяет что-то, что будет часто импортироваться. Этот шаблон способствует приверженности философии Pythonic flat is better than nested
.
Пример:
Предположим, что структура нашего проекта выглядит следующим образом:
/project
- __init__.py
- file1.py
И наша file1.py
выглядит так:
message = 'hi there'
Тогда мы можем получить к нему доступ как:
from project.file1 import message
print(message)
Теперь, чтобы сделать его доступным, как:
from project import message
В __init__.py
мы можем сделать:
from .file1 import message
__all__ = ['message']