Шаг 183.
Python: сборник рецептов.
Модули и пакеты. Создание иерархического пакета модулей

    На этом шаге мы рассмотрим особенности такой реализации.

Задача

    Вы хотите упорядочить ваш код, поместив его в пакет, состоящий из иерархической коллекции модулей.

Решение

    Создать структуру пакета очень просто. Просто организуйте ваш код в структуре каталогов и убедитесь, что каждый каталог содержит файл __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, если вы просто начинаете создание нового пакета.

    На следующем шаге мы рассмотрим контроль импортирования.




Предыдущий шаг Содержание Следующий шаг