Как отобразить скорость ниже нуля в приложении
Что проверяют
Задаёте ли вы уточняющие вопросы, прежде чем писать код. Скорость как величина неотрицательна, и минус означает либо движение назад, либо шум датчика, либо мусор в данных. Интервьюер смотрит, различите ли вы эти случаи и в каком слое приложения будете их обрабатывать.
Как отвечать
Начните с вопроса, что значит минус в конкретной системе, и разберите три варианта:
- направление: это не скорость, а проекция скорости на ось, например движение задним ходом. Показывать модуль через
abs()и отдельный признак направления, а исходный знак сохранять; - шум около нуля: GPS у стоящей машины даёт
-0.3км/ч. Нужна мёртвая зона: всё, что по модулю меньше порога, выводится как ноль; - заведомо неверное значение:
-500это сбой датчика или парсинга. На экране «нет данных», в логах предупреждение, в метриках счётчик таких событий, чтобы проблему заметили.
Архитектурно это решается на границах. Входные данные валидируются при приёме: в Pydantic v2 через Field с ограничениями или field_validator, в простом коде через dataclass с проверкой в __post_init__. Сырые значения хранятся как пришли, а преобразование для показа живёт в слое представления, одной чистой функцией format_speed(value) -> str, которую легко покрыть тестами.
Отдельная ловушка это отрицательный ноль. f"{-0.04:.1f}" даёт строку -0.0, и пользователь видит минус у стоящей машины. С Python 3.11 есть опция z в спецификации формата: f"{x:z.1f}" превращает -0.0 в 0.0. На старых версиях помогает round(x, 1) + 0.0 или явная проверка.
Граничные случаи закройте параметризованным тестом в pytest: 0.0, -0.0, -0.04, -5, float("nan"), None.
Где спотыкаются
Молча оборачивают всё в abs(). Сбойный датчик с -500 превращается в правдоподобные 500 км/ч, а информация о направлении пропадает.
Исправляют значение при записи в базу. Сырые данные потеряны, и разобраться в инциденте потом не по чему.
Сразу пишут график на Matplotlib, не спросив, что означает минус. Задача была про смысл данных и место обработки, а не про раскраску точек.