timedelta: сравнение и нормализация в Python

timedelta: сравнение и нормализация в Python

@python_quiz

Разберем этот квиз

Коротко: данный фрагмент кода сравнивает два объекта timedelta, и сравнение опирается на итоговую длительность, а не на способ её записи. Ниже разберём, почему так происходит, и покажем дополнительные примеры.

Условие (кратко)

В коде создаётся базовая длительность и затем от неё вычитается другой timedelta, после чего результат сравнивают с ещё одним timedelta:

python

Что делает код и какой будет вывод

Вычитание:

  • base = 1 день + 30 секунд = 24 часа + 30 секунд
  • отнимаем 1 час → остаётся 23 часа + 30 секунд

Сравнение двух timedelta смотрит на суммарную длительность. В этом случае обе стороны равны по длительности, поэтому выражение вернёт True.

Пример выполнения:

python

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

Обратите внимание: 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) Разные записи — одно и то же значение:

python

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

python

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

python

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

Вывод

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

Report Page