Паттерн: Опциональные зависимости (v3.0.0+)
Этот кейс демонстрирует правила работы с опциональными зависимостями chutils.
В версии v3.0.0 произошло ломающее изменение: RuntimeError при отсутствии
зависимостей заменён на специализированный OptionalDependencyError.
Что не так в bad_pattern.py?
-
Перехват
RuntimeError(устарело в v3.0.0):python except RuntimeError as e: print(f"Ошибка: {e}")До v3.0.0 некоторые модулиchutilsбросалиRuntimeError. В v3.0.0 это заменено наOptionalDependencyError. Старый код сexcept RuntimeErrorне поймает ошибку. -
Голый перехват
ImportError:python except ImportError: print("cryptography не установлен")Нет hint'а о том, как установить зависимость. Разработчик должен сам догадаться о команде установки. -
Прямой импорт внутренностей пакетов:
python from cryptography.fernet import FernetИмпорт напрямую изcryptographyвместоchutils.crypto— теряется безопасный слой сOptionalDependencyErrorи подсказкой установки.
Что сделано правильно в good_pattern.py?
-
Перехват
OptionalDependencyError(v3.0.0+):python from chutils.exceptions import OptionalDependencyError ... except OptionalDependencyError as e: print(f"Hint: {e.hint}") # "pip install chutils[crypto]"OptionalDependencyErrorсодержит:e.message— описание проблемыe.hint— готовая команда установки (pip install chutils[...])
-
Использование модулей
chutilsвместо прямых зависимостей:python from chutils.crypto import encrypt_portablechutils.cryptoсам проверяет наличиеcryptographyи бросаетOptionalDependencyErrorс правильным hint'ом. -
Разные стратегии для критичных и некритичных функций:
- Некритичная (трассировка, метрики): перехватываем, деградируем с предупреждением.
- Критичная (шифрование данных): не перехватываем — пусть ошибка всплывёт выше.
Миграция с v2.x на v3.0.0
# ❌ Старый код (v2.x):
try:
from chutils.crypto import encrypt_portable
result = encrypt_portable(data, seed="seed")
except RuntimeError:
result = data
# ✅ Новый код (v3.0.0+):
from chutils.exceptions import OptionalDependencyError
try:
from chutils.crypto import encrypt_portable
result = encrypt_portable(data, seed="seed")
except OptionalDependencyError as e:
print(f"Установите зависимость: {e.hint}")
result = data
Ключевой совет для ИИ
[!IMPORTANT] В v3.0.0+ все опциональные зависимости
chutils(crypto, text, web, scraping, otel, metrics) при отсутствии бросаютOptionalDependencyError, а неRuntimeError. Перехватывайте именноOptionalDependencyErrorи используйтеe.hintдля вывода пользователю команды установки.