На этом шаге мы рассмотрим особенности такой реализации.
Вы хотите упорядочить ваш код, поместив его в пакет, состоящий из иерархической коллекции модулей.
Создать структуру пакета очень просто. Просто организуйте ваш код в структуре каталогов и убедитесь, что каждый каталог содержит файл __init__.py. Например:
graphics/
__init__.py
primitive/
__init__.py
line.py
fill.py
text.py
formats/
__init__.py
png.py
jpg.py
Сразу после этого вы сможете выполнять различные инструкции import, такие как:
import graphics.primitive.line from graphics.primitive import line import graphics.formats.jpg as jpg
Определение иерархии модулей не сложнее создания структуры каталогов в файловой системе. В файлы __init__.py можно поместить необязательный код инициализации, который запускается, когда происходит обращение к различным уровням пакета.
Например, если у вас есть инструкция import graphics, будет импортирован файл graphics/__init__.py и сформировано содержание пространства имен graphics. Для инструкции import graphics.formats.jpg будут импортированы файлы graphics/__ init__.py и graphics/formats/__init__.py, причем перед финальным импортированием файла graphics/formats/jpg.py.
Часто можно просто оставить файл __init__.py пустым. Однако есть некоторые ситуации, при которых эти файлы могут содержать код. Например, файл __init__.py может быть использован для автоматической загрузки подмодулей:
# graphics/formats/__init__.py from . import jpg from . import png
При наличии такого файла пользователь должен будет выполнить одну инструкцию import graphics.formats вместо отдельного импортирования graphics.formats.jpg и graphics.formats.png.
Другой типичный пример использования __init__.py - объединение определений из различных файлов в единое логическое пространство имен, что иногда делается при разделении модулей.
Проницательные программисты заметят, что Python 3.3 все еще выполняет импортирование пакетов, даже если файлы __init__.py отсутствуют. Если вы не определяете __init__.py, то создаете так называемый "пакет пространства имен". При прочих равных включайте файлы __init__.py, если вы просто начинаете создание нового пакета.
На следующем шаге мы рассмотрим контроль импортирования.