Compreendendo timedelta

90

Dado o código python abaixo, por favor me ajude a entender o que está acontecendo lá.

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

uptime = end_time - start_time

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

Então eu obtenho a diferença entre start timee end time, na linha 5, eu arredondado a duração fundindo e agora, qual é a explicação adicional?

Eu sei o que delta significa (média ou diferença), mas por que tenho que passar seconds = uptimepara timedeltae por que a fundição de cordas funciona tão bem que eu consigo HH:MM:SS?

Paulo
fonte

Respostas:

114

Porque timedelta é definido como:

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

Todos os argumentos são opcionais e o padrão é 0.

Você pode facilmente dizer "Três dias e quatro milissegundos" com argumentos opcionais dessa forma.

>>> 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)

E para str casting, ele retorna um bom valor formatado em vez de __repr__melhorar a legibilidade. Dos documentos:

str (t) Retorna uma string na forma [D dia [s],] [H] H: MM: SS [.UUUUUU], onde D é negativo para t negativo. (5)

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

Documentação de checkout:

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

utdemir
fonte
13

por que eu tenho que passar segundos = tempo de atividade para timedelta

Porque os objetos timedelta podem ser passados ​​em segundos, milissegundos, dias, etc ... então você precisa especificar o que está passando (é por isso que você usa a chave explícita). Moldar para inté supérfluo, pois eles também podem aceitar flutuadores.

e por que a fundição de cordas funciona tão bem que recebo HH: MM: SS?

Não é o typecasting que formata, é o __str__método interno do objeto. Na verdade, você obterá o mesmo resultado se escrever:

print datetime.timedelta(seconds=int(uptime))
Mac
fonte
1
Você sugere isso, mas vale a pena observar explicitamente que timedelta faz muito mais do que exibir coisas no formato HH: MM: SS. Um objeto timedelta é usado sempre que você precisa fazer uma diferença entre dois objetos datetime.
Wilduck
1
Não é o __repr__método, é o __str__método.
utdemir
1
Não o __repr__()de timedelta, mas seu __str__()método. printchamadas __str()__para você.
bgporter