Посібник для початківців зі створення та використання пакетів у Python

Уявіть собі розробку великої програми, де весь код розміщено в єдиному файлі Python. Хоча технічно це можливо, такий підхід суперечить принципам ефективної розробки, яка передбачає можливість підтримки та повторного використання програмного забезпечення. Саме тому для створення надійних програмних продуктів необхідні пакети та модулі.

Що таке пакет?

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

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

Різниця між пакетами та модулями

Хоча і пакети, і модулі призначені для організації коду, між ними є ключова відмінність:

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

Як створити пакет у Python

Для створення власного пакета потрібно виконати наступні кроки:

Крок 1: Створення каталогу проєкту

Перш за все, створіть каталог, який буде представляти ваш проєкт.

 study_bud/

Крок 2: Створення каталогу пакета

Всередині каталогу вашого проєкту створіть ще один каталог, який буде служити каталогом для вашого пакета. Дайте йому чітку назву, яка відображає призначення пакета. У цьому каталозі будуть розміщуватися модулі та підпакети вашого пакета.

 study_bud/
math_tool/

Крок 3: Створення файлу __init__.py

Усередині каталогу пакета створіть файл під назвою __init__.py. Наявність цього файлу в каталозі робить його пакетом Python.

Якщо вам потрібно виконувати певну ініціалізацію при кожному використанні пакета, додайте відповідний код у файл __init__.py. Якщо ж ніякої ініціалізації не потрібно, залиште файл пустим.

 study_bud/
math_tool/
__init__.py

Крок 4: Додавання модулів до пакета

У каталозі пакета створіть файли Python (.py), які будуть містити функції, класи або змінні. Ці модулі містять основний код, який реалізує функціональність вашого пакета. Ви можете створювати будь-яку кількість модулів у каталозі пакета.

 study_bud/
math_tool/
__init__.py
operations.py
statistics.py

Крок 5: Додавання підпакетів до пакета

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

 study_bud/
math_tool/
__init__.py
operations.py
statistics.py
geometry/
__init__.py
shapes.py
calculus/
__init__.py
integrations.py

У цьому прикладі ми створили пакет math_tool, до якого додали два модулі (operations.py та statistics.py) та два підпакети geometry і calculus, кожен зі своїми модулями.

Виконуючи ці кроки, ви зможете легко організувати пов’язані функції у пакет та підпакети, що значно спростить управління кодом та його повторне використання.

Як працювати з пакетом у Python

Для використання пакета його потрібно імпортувати. Для цього використовуються ключові слова import та from.

 import math_tool

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

 from math_tool.operations import add, multiply

У цьому прикладі ми перейшли з каталогу пакета (math_tool) до модуля operations за допомогою крапкової нотації і імпортували дві функції (add та multiply).

Абсолютний імпорт проти відносного імпорту

При використанні абсолютного імпорту ви вказуєте повний шлях від кореневого каталогу пакета до потрібного модуля чи підпакета. Це найбільш поширений і рекомендований спосіб імпорту в Python.

 from math_tool.geometry.shapes import parallelogram

У цьому прикладі ми починаємо з пакета math_tool, переходимо до підпакета geometry, потім до модуля shapes.py, і імпортуємо функцію parallelogram.

Відносний імпорт дозволяє робити імпорт відносно поточного положення модуля, використовуючи крапкову нотацію для визначення відносного імпорту.

Наприклад, у модулі calculus/integrations.py ви можете використати відносний імпорт, щоб імпортувати функцію з модуля shapes.py в підпакеті geometry.

 from ..geometry.shapes import rhombus

Подвійна крапка (“..”) вказує Python:

  • Почати з каталогу підпакета (calculus), де знаходиться модуль (integrations.py).
  • Перейти до каталогу батьківського пакета (math_tool).
  • Знайти підпакет geometry у батьківському каталозі.
  • Зайти до модуля shapes.py та імпортувати з нього функцію rhombus.

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

Імпорт псевдонімів для зручності

Ви можете присвоїти імпорту псевдонім для зручності використання у коді. Псевдоніми особливо корисні, коли ви працюєте з довгими іменами пакетів або модулів.

Для присвоєння псевдоніма використовуйте ключове слово as.

 import math_tool.calculus as cal

Як розповсюдити свій пакет у Python

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

Крок 1: Створення облікового запису на PyPI

Python Package Index (PyPI) – це офіційне сховище для пакетів Python. Ви можете публікувати свої пакети на PyPI, щоб інші розробники могли їх легко знайти та встановити.

Збережіть своє ім’я користувача та пароль, оскільки вони знадобляться для аутентифікації при завантаженні пакета на PyPI.

Крок 2: Встановлення інструментів керування пакетами

Ці інструменти значно спрощують процес конфігурації, створення та відправлення пакетів за допомогою однієї команди.

 pip install build wheel twine

Крок 3: Створення файлу setup.py

Для розповсюдження пакета потрібно створити файл setup.py у кореневому каталозі проєкту. Цей файл містить метадані про ваш пакет, такі як назва, версія, автор, опис, залежності та інші.

Інструменти керування пакетами використовують цей файл для налаштування та створення вашого пакета.

 from setuptools import setup, find_packages
setup(
    name="<package name>",
    version='1.0.0',
    author="<Your Name>",
    description='A collection of mathematical utility functions',
    packages=find_packages(),
    install_requires=[
        'numpy',
        'scipy',
    ],
)

Крок 4: Створення пакета

Коли файл setup.py готовий, його можна використовувати для створення пакета для розповсюдження. У терміналі перейдіть до каталогу з файлом setup.py та виконайте команду:

 python setup.py sdist bdist_wheel

Ця команда створить каталог dist, який міститиме вихідний пакет дистрибуції (.tar.gz) та пакет дистрибуції wheel (.whl). Також будуть створені каталоги build та інші тимчасові файли.

Крок 5: Завантаження пакета на PyPI

Коли пакет готовий, його можна завантажити на PyPI.

Виконайте наступну команду:

 twine upload dist/*
> Uploading distributions to https://upload.pypi.org/legacy/
> Enter your username: **********
> Enter your password: **********

Перейдіть на сторінку управління проєктами на PyPI, щоб побачити свій пакет.

Тепер інші розробники зможуть встановити та використовувати ваш пакет локально.

Як встановити пакет Python

Менеджери пакетів, такі як pip, спрощують встановлення та управління пакетами Python з різних джерел, включаючи PyPI. Щоб встановити пакет за допомогою pip, відкрийте термінал і введіть наступну команду:

 pip install <package_name>

Щоб переглянути всі доступні команди та параметри для pip, використовуйте параметр –help.

Написання чистих модулів

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