Розуміння таймельта


90

Враховуючи код python нижче, будь ласка, допоможіть мені зрозуміти, що там відбувається.

start_time = time.time()
time.sleep(42)
end_time = time.time()

uptime = end_time - start_time

human_uptime = str(datetime.timedelta(seconds=int(uptime)))

Тож я отримую різницю між start time і end time, у рядку 5 я збільшую тривалість за допомогою кастингу і що зараз, яке подальше пояснення?

Я знаю, що означає дельта (середнє значення чи різниця), але чому я повинен переходити seconds = uptimeдо timedeltaі чому кастинговий рядок працює так гарно, що я отримую HH:MM:SS?

Відповіді:


114

Оскільки timedelta визначається так:

class datetime.timedelta([days,] [seconds,] [microseconds,] [milliseconds,] [minutes,] [hours,] [weeks])

Усі аргументи необов’язкові і за замовчуванням дорівнюють 0.

Ви можете легко сказати "Три дні та чотири мілісекунди" з необов'язковими аргументами таким чином.

>>> datetime.timedelta(days=3, milliseconds=4)
datetime.timedelta(3, 0, 4000)
>>> datetime.timedelta(3, 0, 0, 4) #no need for that.
datetime.timedelta(3, 0, 4000)

А для кастингу str повертає гарне відформатоване значення, а не __repr__для поліпшення читабельності. З документів:

str (t) Повертає рядок у формі [D день [с],] [H] H: MM: SS [.UUUUUU], де D від’ємне для від’ємного t. (5)

>>> datetime.timedelta(seconds = 42).__repr__()
'datetime.timedelta(0, 42)'
>>> datetime.timedelta(seconds = 42).__str__()
'0:00:42'

Документація оформлення замовлення:

http://docs.python.org/library/datetime.html#timedelta-objects


13

чому я повинен передавати секунди = час безвідмовної роботи timedelta

Оскільки об’єктам timedelta можна передавати секунди, мілісекунди, дні тощо ..., тож вам потрібно вказати, що ви передаєте (саме тому ви використовуєте явний ключ). Введення тексту в текст intзайве, оскільки вони також можуть приймати поплавки.

і чому кастинг рядків працює так гарно, що я отримую HH: MM: SS?

Форматування не є типовим тестуванням, це внутрішній __str__метод об’єкта. Насправді ви досягнете того самого результату, якщо напишете:

print datetime.timedelta(seconds=int(uptime))

1
Ви натякаєте на це, але варто прямо зазначити, що timedelta робить набагато більше, ніж відображати речі у форматі HH: MM: SS. Об'єкт timedelta використовується, коли потрібно визначити різницю між двома об'єктами datetime.
Wilduck

1
Це не __repr__метод, це __str__метод.
utdemir

1
Не __repr__()тиммельта, а його __str__()спосіб. printдзвонить __str()__вам.
bgporter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.