Ответ
Да, создавал. Один из последних пакетов — это внутренняя утилита для конфигурации микросервисов. Она автоматически загружала настройки из 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, которые я применял:
pyproject.tomlвместоsetup.py: Использовал современный стандарт для указания зависимостей, entry points и метаданных.- Структура
src/: Это предотвращает случайный импорт из неинсталлированной версии кода. - Типизация и документация: Полностью типизировал публичные функции и использовал docstring в формате Google. Добавил
README.mdс примерами использования. - Тестирование и публикация: Настроил
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 сервисах нашей команды, что упростило управление настройками и их валидацию на этапе запуска.