Как создать библиотеку на Python?

«Как создать библиотеку на Python?» — вопрос из категории Python, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Создание Python-библиотеки включает несколько ключевых этапов. Я создавал несколько внутренних библиотек для проектов — вот мой типичный workflow:

1. Структура проекта

mylibrary/
├── mylibrary/           # Основной пакет
│   ├── __init__.py
│   ├── core.py
│   └── utils.py
├── tests/               # Тесты
│   ├── __init__.py
│   └── test_core.py
├── setup.py            # Конфигурация установки
├── pyproject.toml      # Современная конфигурация
├── README.md
├── LICENSE
└── requirements.txt

2. Основные файлы конфигурации

setup.py (классический подход):

from setuptools import setup, find_packages

with open("README.md", "r", encoding="utf-8") as fh:
    long_description = fh.read()

setup(
    name="mylibrary",
    version="0.1.0",
    author="Ваше Имя",
    author_email="email@example.com",
    description="Краткое описание библиотеки",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/username/mylibrary",
    packages=find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires=">=3.8",
    install_requires=[
        "requests>=2.25.0",
        "pandas>=1.3.0",
    ],
)

Или современный pyproject.toml:

[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "mylibrary"
version = "0.1.0"
authors = [
    {name = "Ваше Имя", email = "email@example.com"}
]
description = "Краткое описание библиотеки"
readme = "README.md"
requires-python = ">=3.8"
license = {text = "MIT"}

[project.urls]
"Homepage" = "https://github.com/username/mylibrary"
"Bug Tracker" = "https://github.com/username/mylibrary/issues"

[project.dependencies]
requests = ">=2.25.0"
pandas = ">=1.3.0"

[tool.setuptools.packages.find]
where = ["."]

3. Реализация функционала

mylibrary/core.py:

"""Основной модуль библиотеки"""

import requests
from typing import Dict, Any, Optional

class APIClient:
    """Клиент для работы с API"""

    def __init__(self, base_url: str, api_key: Optional[str] = None):
        self.base_url = base_url.rstrip('/')
        self.session = requests.Session()
        if api_key:
            self.session.headers.update({
                'Authorization': f'Bearer {api_key}'
            })

    def get_data(self, endpoint: str, params: Dict[str, Any] = None) -> Dict:
        """GET запрос к API"""
        url = f"{self.base_url}/{endpoint.lstrip('/')}"
        response = self.session.get(url, params=params)
        response.raise_for_status()
        return response.json()

4. Сборка и публикация

# Установка в режиме разработки
pip install -e .

# Сборка дистрибутивов
python -m build

# Тестирование
pytest tests/

# Публикация в PyPI (после настройки учетных данных)
twine upload dist/*

5. Дополнительные практики

  • Написание документации в docstrings (Google style или NumPy style)
  • Использование type hints для лучшей поддержки IDE
  • Настройка CI/CD через GitHub Actions для автоматического тестирования и публикации
  • Семантическое версионирование (SemVer)
  • Добавление pre-commit hooks для проверки кода