Пакеты в Python
Пространства имен это неотъемлемая часть программирования, так как позволяет избегать конфликтов имен при операциях импорта. В Python данную функцию выполняют пакеты. Пакет в Python - это папка с модулями и файлом init.py. Модули в Python, в свою очередь - это файлы кода, с расширением .py. Для более детального понимания сути сказанного, создадим папку с именем mypackage и рядом файл main.py. Это будет главный файл, с которого начнет выполняться программа. В папку mypackage поместим файлы module1 и module2 и определим в них переменные и методы:
# module1.py
a = 1
b = 2
c = 'myrusakov'
def do_some():
pass
# module2.py
d = 5
e = 7
f = "website"
Теперь в главном файле main.py, находящимся на уровне папки mypackage попробуем импортировать наш будущий папку/пакет mypackage. Но прежде, напомню, что в Python есть несколько вариантов импорта. В зависимости от того импортируем мы сам пакет, модуль из него или же переменные и методы модуля
# в файле main.py все операции импорта
import mypackage
mypackage.module1
''' возникает ошибка, так как mypackage это пока что, просто папка а не пакет, и для нее справедлив такой вариант:'''
import mypackage.module1
# так вызываем переменные из модуля
print(mypackage.module1.a)
# вывод
1
Также можно обойтись без названия папки, путем импорта самих модулей или же переменной из модуля:
from mypackage import module1, module2
print(module.a)
from mypackage.module1 import a
print(a)
Но как мы знаем в Python можно импортировать пакет и все переменные модулей будут видны из одного места. Чтобы превратить нашу папку в пакет, в папке mypackage создадим файл init.py. И каждый раз при импорте модуля первым исполнится данный файл. Для проверки сказанного поместим в него print("init"):
# main.py
import mypackage
# вывод
#__init__
Так для чего это нужно. Как мы уже знаем при импорте кода в виде модуля из папки/пакета мы используем import mypackage.module1. И чтобы постоянно не обращаться ко всем модулям в папке, так как их может быть много мы и используем файл init.py
# __init__.py
from . module1 import a, b, с
from . module2 import d, e, f
# точка здесь указывает путь относительно которого мы производим импорт, и означает текущий каталог
# __init__.py
# оператор * значит импорт всего из
from . import *
# main.py
import mypackage
mypackage.module2.d
Также в самих импортируемых файлах можно указать список разрешенный для импорта с помощью __all__. Посредством данного списка Вы ограничиваете набор экспортируемых констант, методов, классов.
# module1.py
__all__ = ['a', 'b']
a = 1
b = 2
c = 'myrusakov'
Таким образом в Python достаточно просто превратить папку с кодом в пакет, и тем самым повысив удобочитаемость импортируемого кода.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.