timedelta: сравнение и нормализация в Python
@python_quizРазберем этот квиз
Коротко: данный фрагмент кода сравнивает два объекта timedelta, и сравнение опирается на итоговую длительность, а не на способ её записи. Ниже разберём, почему так происходит, и покажем дополнительные примеры.
Условие (кратко)
В коде создаётся базовая длительность и затем от неё вычитается другой timedelta, после чего результат сравнивают с ещё одним timedelta:

Что делает код и какой будет вывод
Вычитание:
base = 1день + 30 секунд = 24 часа + 30 секунд- отнимаем 1 час → остаётся 23 часа + 30 секунд
Сравнение двух timedelta смотрит на суммарную длительность. В этом случае обе стороны равны по длительности, поэтому выражение вернёт True.
Пример выполнения:

Ожидаемый вывод (пример):

Обратите внимание: seconds в представлении — это остаток секунд от дня (82830 = 23*3600 + 30).
Почему сравнение работает именно так
- datetime.timedelta хранит длительность в виде трёх полей: days, seconds и microseconds, но при создании/операциях они нормализуются: seconds всегда меньше 86400 (количество секунд в дне), microseconds < 1_000_000.
- Операции сложения и вычитания возвращают нормализованный timedelta.
- При сравнении учитывается итоговая длительность (внутренне сравнивается число дней и секунд/микросекунд как нормализованных полей) — то есть разные представления одной и той же длительности считаются равными.
Разбор вариантов ответов (логика)
- Утверждение, что оба timedelta эквивалентны по длительности — оправдано: выражение действительно вернёт True.
- Идея, что сравниваются "разные поля" и поэтому будет False — неверна: сравнение идёт по итоговой длительности после нормализации.
- Утверждение про ошибку при вычитании timedelta с часами — неверно: timedelta поддерживает сложение/вычитание, часы просто синтаксический сахар для создания timedelta.
- Утверждение про ошибку сравнения разных типов — неверно: здесь сравниваются объекты одного типа (timedelta с timedelta), ошибок нет.
Дополнительные примеры и нюансы
1) Разные записи — одно и то же значение:

2) Нормализация при больших полях:

3) Отрицательные длительности:

Здесь важно помнить, что отрицательные timedelta тоже нормализуются и могут показываться с отрицательным количеством дней и положительным числом секунд (внутреннее представление), но арифметически сравнения и операции остаются корректными.
Вывод
timedelta нормализует поля и сравнивает итоговую длительность. Поэтому разные способы задания одной и той же длины времени эквивалентны при сравнении — в рассматриваемом фрагменте результат будет True.