Создавал ли собственные библиотеки или пакеты на Python?

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

Ответ

Да, создавал. Один из последних пакетов — это внутренняя утилита для конфигурации микросервисов. Она автоматически загружала настройки из Consul, валидировала их по Pydantic-схемам и предоставляла готовый объект конфига с кэшированием.

Структура пакета internal_config:

internal_config/
├── pyproject.toml          # Современная конфигурация с setuptools
├── src/
│   └── internal_config/
│       ├── __init__.py
│       ├── loader.py       # Логика загрузки из Consul/Vault
│       ├── validator.py    # Валидация через Pydantic
│       └── exceptions.py
└── tests/

Ключевые шаги и best practices, которые я применял:

  1. pyproject.toml вместо setup.py: Использовал современный стандарт для указания зависимостей, entry points и метаданных.
  2. Структура src/: Это предотвращает случайный импорт из неинсталлированной версии кода.
  3. Типизация и документация: Полностью типизировал публичные функции и использовал docstring в формате Google. Добавил README.md с примерами использования.
  4. Тестирование и публикация: Настроил pytest с покрытием, а публикацию в приватный Artifactory выполнял через twine.

Пример фрагмента кода из __init__.py:

from .loader import ConfigLoader
from .validator import AppConfig
from typing import Optional
import cachetools

class ConfigurationManager:
    _cache = cachetools.TTLCache(maxsize=10, ttl=300)

    def __init__(self, service_name: str):
        self.service_name = service_name

    def get_config(self) -> AppConfig:
        """Возвращает валидированную конфигурацию для сервиса."""
        if self.service_name not in self._cache:
            loader = ConfigLoader(self.service_name)
            raw_config = loader.fetch()
            self._cache[self.service_name] = AppConfig(**raw_config)
        return self._cache[self.service_name]

Пакет используется в более чем 10 сервисах нашей команды, что упростило управление настройками и их валидацию на этапе запуска.