Пакеты в Python
В этой статье вы научитесь разбивать вашу программу на компактные и элегантные модули — пакеты. Также вы узнаете как импортировать собственные и сторонние пакеты в ваши проекты.
Что такое пакеты
Никто из нас не хранит все файлы на компьютере в одном месте. У каждого из нас хорошо организованная иерархия папок — так проще найти нужный файл.
Файлы одного и того же типа хранятся в одной папке. Например, песни мы храним в папке «музыка». То же самое и в Python — для разных фрагментов кода свои директории и модули.
С ростом количества строк кода в проекте растет и количество модулей. Одни модули мы храним в одном пакете, другие — в другом. Так проектом проще управлять, он становится понятнее.
Как папки содержат подпапки, так и пакеты Python содержит подпакеты и модули.
Чтобы Python воспринимал папку как пакет, в ней должен содержаться файл __init__.py
. Он может быть пустым, но обычно в нем содержится инициализационный код этого пакета.
Приведем пример — допустим, вы разрабатываете игру. На картинке представлен возможный вариант организации пакетов и модулей.
Импорт модулей из пакета
Мы можем импортировать модули из пакетов с помощью оператора-точки — .
.
Допустим, нам нужно импортировать модуль start
. Делается это так:
import Game.Level.start
Если в этом модуле есть функция select_difficulty()
, то вызвать мы ее можем так:
Game.Level.start.select_difficulty(2)
Конструкцию можно сократить — нужно лишь импортировать модуль без префикса пакета:
from Game.Level import start
Теперь функцию можно вызывать следующим образом:
start.select_difficulty(2)
Еще один способ импортирования нужной функции (класса или переменной) из модуля внутри пакета:
from Game.Level.start import select_difficulty
Теперь функцию можно вызывать напрямую:
select_difficulty(2)
Несмотря на простоту, использовать этот способ не рекомендуется. Причина проста — использование полного пространства имен убережет вас от ошибок. Например, если в проекте встретятся два одинаковых имени идентификаторов.
Во время импорта пакетов Python просматривает список директорий в sys.path — точно так же, как в случае с модулями.