Ответ
Создание 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 для проверки кода