[ Сборник задач ] Тема 12. Импорт. Модули и пакеты

Чтобы не хранить вереницу кода в одном файле, его удобно разбивать по отдельным документам. В результате такого действия разработчик структурирует свой проект и делит его на модули и пакеты. Чтобы получить к ним доступ в конкретном файле скрипта требуется провести импортирование с помощью команды import. Это не единственный, но чаще всего используемый способ. Библиотеки можно легко переносить по своим проектам, их проще править и рефакторить.

Задача. Базовый уровень

Условие

Создайте пакет ‘figures’, состоящий из трех подпакетов: ‘triangle’, ‘circle’, ‘square’. В каждом подпакете будем иметь файл code.py, где создадим ряд функций: – для пакета ‘circle’: функции circle_perimeter() – вычисляет длину окружности, circle_area() – вычисляет площадь окружности. Еще заведем переменную default_radius = 5, которая будет скрыта при импорте модуля. Ее назначение – дефолтный радиус для окружности, если пользователь не введет свой. Обе функции принимают на вход только радиус. – для пакета ‘triangle’: функции triangle_perimeter() – вычисляет периметр треугольника, triangle_area() – вычисляет площадь фигуры. Дополнительно создадим три переменные (длины сторон треугольника): a = 7, b = 2, c = 8, которые также не будут видны при импорте. На вход функциям передается длина трех сторон (если пользователь ничего не введет, то используются значения по умолчанию). – для пакета ‘square’: функции square_perimeter() – вычисляет периметр квадрата, square_area() – вычисляет площадь фигуры. Дополнительная переменная a = 15 не доступна при импорте и принимается функциями, если пользователь не предоставил свои размеры стороны квадрата. Ваша итоговая задача – позволить человеку, загрузившему ваш пакет, иметь возможность напрямую импортировать все функции из подпакетов. Например, он может написать так: ‘from figure import circle_area’. Также вы, как разработчик, после написания всей библиотеки решили поменять ее имя на ‘figures’. Постарайтесь сделать код таким, чтобы это не заставило вас переписывать все внутренние импорты с учетом нового именования.

Для решения задания понадобится использовать относительные импорты. Представленный подход – пример реализации удобного API. Причем это удобство получают обе стороны: вы, как разработчик (легко можно расширять библиотеку без полного переписывания импортов), а также пользователи, которым не нужно разбираться в дебрях библиотеки и осуществлять сумасшедшие импорты (типа from figures.circle.code import circle_area).

Ниже продемонстрирована файловая структура проекта:

Содержимое каждого документа можно посмотреть/скачать на GitHub. Для примера посмотрим на код корневого файла пакета __init__.py, а также скриптов из подпакета circle.

Пример — IDE

Пример – IDE (файл «__init__.py» из пакета «circle»)

from .code import circle_area, circle_perimeter

Пример – IDE (файл «code.py» из пакета «circle»)

Теперь данную библиотеку может скачать любой пользователь и без проблем импортировать ее в свой проект, получив легкий и удобный доступ к 6-ти созданным нами функциям.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *