web-dev-qa-db-fra.com

Comprendre Timedelta

Étant donné le code python ci-dessous, aidez-moi à comprendre ce qui se passe là-bas.

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

uptime = end_time - start_time

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

Donc, je fais la différence entre start time et end time, à la ligne 5, j'arrondis la durée par le casting et que maintenant, quelle explication supplémentaire?

Je sais ce que signifie delta (moyenne ou différence), mais pourquoi dois-je passer seconds = uptime à timedelta et pourquoi le casting de la chaîne fonctionne-t-il si bien que je reçois HH:MM:SS?

83
Paul

Parce que timedelta est défini comme:

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

Tous les arguments sont facultatifs et la valeur par défaut est 0.

Vous pouvez facilement dire "Trois jours et quatre millisecondes" avec des arguments optionnels de cette façon.

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

Et pour la diffusion de chaîne, il retourne une valeur formatée Nice au lieu de __repr__ pour améliorer la lisibilité. De docs:

str (t) Renvoie une chaîne sous la forme [jour J [s],] [H] H: MM: SS [.UUUUUU], où D est négatif pour t négatif. (5)

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

Documentation de caisse:

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

110
utdemir

pourquoi dois-je passer secondes = temps de disponibilité à timedelta

Parce que les objets timedelta peuvent être passés en secondes, en millisecondes, en jours, etc., vous devez donc spécifier ce que vous transmettez (c'est pourquoi vous utilisez la clé explicite). Le transtypage de caractères en int est superflu, car ils pourraient également accepter des flottants.

et pourquoi le casting fonctionne-t-il si bien que je reçois HH: MM: SS?

Ce n'est pas la conversion de typage qui formate, c'est la méthode interne __str__ de l'objet. En fait, vous obtiendrez le même résultat si vous écrivez:

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