|
32 | 32 | API отдаёт Кельвины; если формат/версия сменится (Цельсий/Фаренгейт), температура молча |
33 | 33 | станет бессмысленной. Хотя бы вынести константу с именем и не хардкодить конверсию вслепую. |
34 | 34 |
|
35 | | -8. **`get_many` падает целиком из-за одного города** (строка 30). Dict-comprehension по всем |
36 | | - городам: первое же исключение в `get_weather` (нет города, таймаут) уронит **весь** батч. |
37 | | - Для устойчивого пакетного запроса стоит обрабатывать ошибки по городу отдельно (собрать |
38 | | - успехи, а неудачи — в отдельный список/лог). |
| 35 | +8. **`get_many` падает целиком из-за одного города и работает последовательно** (строка 30). |
| 36 | + Dict-comprehension по всем городам: первое же исключение в `get_weather` (нет города, таймаут) |
| 37 | + уронит **весь** батч — стоит обрабатывать ошибки по городу отдельно (собрать успехи, а |
| 38 | + неудачи — в список/лог). Плюс запросы идут по одному, синхронно: на большом списке городов |
| 39 | + это долго. Параллелить — через `asyncio` + async-клиент (`httpx`) или `ThreadPoolExecutor` |
| 40 | + с ограничением конкурентности. |
39 | 41 |
|
40 | 42 | 9. **`get_forecast` не считает статус/таймаут** — те же проблемы, что 3–5, плюс главный |
41 | 43 | `eval` из п.1. |
42 | 44 |
|
43 | 45 | 10. **Нет аннотаций типов** (все функции). `city: str`, `days: int`, тип результата. |
44 | 46 |
|
| 47 | +11. **Вход `city`/`days` не валидируется и не нормализуется** (строки 9, 25). Город уходит в |
| 48 | + запрос как есть: пустая строка, лишние пробелы, произвольный регистр — всё летит на API |
| 49 | + (и ломает URL, см. п.6). Стоит нормализовать (`strip`, регистр) и отклонять заведомо |
| 50 | + невалидное; `days` — проверять на разумный диапазон, а не слать любое число. |
| 51 | + |
| 52 | +12. **Ответ возвращается сырым dict без схемы** (строки 18–22, 28). Наружу отдаётся |
| 53 | + вручную собранный словарь — контракт клиента нигде не описан, опечатка в ключе не ловится. |
| 54 | + Возвращать стоит типизированную модель (dataclass/pydantic), тогда и результат `get_weather`, |
| 55 | + и элементы `get_forecast` имеют явный проверяемый формат. |
| 56 | + |
45 | 57 | **Итого:** `eval` над ответом (RCE), слепое доверие структуре и отсутствие проверки статуса/ |
46 | 58 | таймаутов. Мораль: ответ внешнего API — недоверенные данные; парсить его `json()` (никогда |
47 | 59 | `eval`), проверять статус, обкладывать таймаутом и не доверять, что ключи на месте. |
0 commit comments