Распаковка аргументов и flexible API
Python
Senior
Яндекс
Как вы используете `*args` и `**kwargs` в публичном API так, чтобы не ломать обратную совместимость при добавлении новых параметров? Приведите пример хорошего и плохого дизайна.
Ответы
Гибкие сигнатуры
Плохой дизайн — всё свалить в `*args, **kwargs` без явных параметров: теряется читаемость, автодополнение и статическая проверка.
Хороший подход:
- чётко описать обязательные параметры;
- использовать `*` для отделения позиционных от именованных;
- новое поведение добавлять через именованные аргументы с значениями по умолчанию.
Пример:
```python
def fetch(url: str, *, timeout: float = 5.0, retries: int = 3, **kwargs):
...
```
Старый код, не знающий о новых параметрах, продолжит работать. `**kwargs` можно использовать для прокидывания параметров ниже по стеку, но внутри лучше явно извлечь нужные ключи.