Модулі та пакети

Модульність у Python означає, що код можна розділити на менші частини (модулі), які можна повторно використовувати в інших програмах. Це один із ключових принципів розробки програмного забезпечення, що забезпечує гнучкість, зручність супроводу та масштабованість.

Використання стандартних або вільнодоступних (з відкритим похідним кодом) модулів та пакетів Python суттєво скорочує час на розробку та підвищує якість та надійність застосунку, що розробляється.

У цьому розділі:

Мотивація

Прості програми можна розробляти в одному файлі. Якщо програма складна, то вона може містити десятки та сотні функцій та класів. Файл такої програми може складатися з тисячі рядків коду.

Такий підхід створює кілька проблем:

  • Ускладнене тестування та налагодження – пошук і виправлення помилок у великому файлі стає складнішим, оскільки потрібно аналізувати великий обсяг коду.
  • Погіршення читабельності – чим більше рядків коду в одному файлі, тим важче його розуміти та підтримувати.
  • Зменшення можливості повторного використання коду – якщо код не розділений на логічні частини, його важко використовувати в інших проєктах.
  • Зниження гнучкості розробки – командна робота ускладнюється, оскільки кілька розробників працюють з одним великим файлом, що призводить до конфліктів у коді.

Рішенням цих проблем є розбиття програми на модулі та пакети. Це дозволяє:

  • Легше організовувати код, розділяючи його на незалежні частини.
  • Підвищувати зручність тестування та налагодження.
  • Спрощувати командну розробку, коли різні розробники працюють з окремими модулями.
  • Використовувати вже написаний код у нових проєктах без дублювання.

Таким чином, модульність є одним із ключових принципів розробки програмного забезпечення, що забезпечує масштабованість, зручність супроводу та повторне використання коду.

Модулі

Модуль — це об’єкт, який слугує організаційною одиницею коду в Python. Модулі мають простір імен, що містять будь-які об’єкти Python. Модулі завантажуються в Python за допомогою процесу імпорту (імпортування).

Модуль у Python — це будь-який файл з розширенням *.py.

Для того, щоб використати будь-який обʼєкт з модуля його треба імпортувати за допомогою ключових слів from та import. Спроба використати обʼект без його імпорту призводить до помилки NameError з повідомленням, що зазначене імʼя не визначене (name is not defined):

>>> print(pi)
Traceback (most recent call last):
  File "<python-input-0>", line 1, in <module>
    print(pi)
          ^^
NameError: name 'pi' is not defined

Приклад коректного імпорту імені pi з модуля math:

>>> from math import pi
>>> print(pi)
3.141592653589793

Артибути модулю — усі імена, які визначені на самому верхньому рівні області видимості. Звичайно це:

  • змінні;
  • функції;
  • класи.

Наприклад, якщо ми створимо файл func.py з таким змістом:

pi: float = 3.14

def sphere_volume(r: float) -> float:

    def cube(v: float) -> float:
      return v * v * v

    return cube(r) * pi * 3 / 4

то таким чином ми створили модуль func та серед його атрибутів є два обʼєкти: змінна pi та функція sphere_volume. Важливо: серед атрибутів цього модулю не має функціі cube, тому що вона визначена не в найвищої області видимості. Спроба викорастати функцію cube призведе до помилки NameError:

>>> from func import *
>>> pi
3.14
>>> sphere_volume(10)
2355.0
>>> cube(3)
Traceback (most recent call last):
  File "<python-input-6>", line 1, in <module>
    cube
NameError: name 'cube' is not defined

Пакети

Пакет — це модуль, який може містити підмодулі або, рекурсивно, підпакети. Звичайний пакет у Python — це директорія на диску, яка має файл __init__.py.

Переваги модульності

Повторне використання коду (Code Reusability). Написавши модуль один раз, його можна підключати до інших програм, уникаючи дублювання коду. Наприклад, бібліотека math дозволяє використовувати математичні функції без необхідності їх написання з нуля.

Спрощене тестування та відлагодження. Якщо програма розбита на окремі модулі, тестування кожного з них окремо є набагато зручнішим. Наприклад, модулі можна тестувати за допомогою пакетів unittest чи pytest.

Краща організація коду. Код у великих проєктах легше структурувати, якщо він поділений на логічні частини. Приклад файлової структури модуля:

my_project/
├── main.py
├── utils.py
├── database.py
└── config.py

Далі у main.py можна імпортувати інші модулі:

from utils import helper_function
from database import connect_db

Як встановити пакет з репозиторію PyPI?

Встановлювати стандартні пакети Python не треба. Вони йдуть разом з інтерпретатором Python. Але якщо треба використовувати сторонній пакет, то його треба встановити до використання.

Python Package Index (PyPI) – це офіційний репозиторій для Python-пакетів, який дозволяє розробникам знаходити, встановлювати та публікувати бібліотеки для Python. Він є основним джерелом сторонніх пакетів і активно використовується в екосистемі Python. Офіційна адреса: https://pypi.org/

PyPI містить тисячі пакетів. Кожен пакет має свою сторінку з описом, документацією та списком версій. Наприклад, requests — популярна бібліотека для роботи з HTTP-запитами має адресу https://pypi.org/project/requests/

Python використовує менеджер пакетів pip для встановлення бібліотек. pip дозволяє легко додавати сторонні пакети до проєкту.

Щоб встановити пакет, достатньо виконати команду в терміналі:

pip install назва_пакета

Наприклад, щоб встановити бібліотеку requests для роботи з HTTP-запитами:

pip install requests

Якщо потрібно встановити певну версію пакета, слід вказати її номер:

pip install requests==2.31.0

Джерела