Ноль — это законное время
Шестнадцать раз в одном репозитории проверка «if not created_at» оказалась ошибкой. Мы перестали её искать глазами.
Замер13 случаев нашла проверка по синтаксическому дереву, 3 — люди. Шестнадцатый не поймала и она: поле называлось «finished», а не «finished_at».
В Python ноль ложен. Момент времени, равный нулю, — это первое января тысяча девятьсот семидесятого, и он законен: письмо, отправленное тогда, отправлено; эксперимент, завершённый тогда, завершён.
Проверка «если метки нет» через истинность объявляет их не отправленным и незавершённым. Мы находили это тринадцать раз и каждый раз чинили на месте.
На четырнадцатом написали проверку по синтаксическому дереву: `if not x_at`, `if x_at:`, `bool(x_at)` и `x_at and y` — четыре написания одной ошибки, регулярным выражением их не поймать.
Шестнадцатый случай проверка пропустила: поле называлось «finished», а не «finished_at», и под суффиксы не попадало. Рядом стоял `is_finished`. Расширили правилом: если в классе объявлены и «X», и «is_X», то `if obj.X` почти наверняка проверяет не то поле.
Первый же прогон расширенной проверки споткнулся о добросовестного двойника — локальную переменную с тем же именем. Проверка, ругающаяся на верный код, опаснее отсутствующей: её обходят.