J'aide un ami dans une tâche de devoirs qui demande à un utilisateur d'entrer un nombre arbitraire de secondes et d'afficher une chaîne qui représente cette durée en termes de semaines, de jours, d'heures, de minutes et de secondes.Pourquoi diviser puis multiplier de grands entiers retourne des résultats étranges en Python?
J'ai une classe TimeUnit
qui hérite de int
et n'autorise pas la création d'unités de temps négatives. J'ai alors une classe TimePeriod
composée de TimeUnits
qui affiche la chaîne.
Plus précisément, il est ce phénomène qui me confond:
class TimeUnit(int):
"""A class that defines the semantics of a unit of time i.e. seconds, minutes, hours etc."""
def __new__(cls, x):
"""Ensure no negative units are created."""
if x < 0:
raise ValueError(f'Must be greater than zero')
return super().__new__(cls, x)
def __eq__(self, other):
if isinstance(other, TimeUnit):
return int(self.to_seconds()) == other.to_seconds()
return super().__eq__(other)
@classmethod
def from_seconds(cls, seconds):
raise NotImplementedError
def to_seconds(self):
raise NotImplementedError
class Seconds(TimeUnit):
@classmethod
def from_seconds(cls, seconds):
return cls(seconds)
def to_seconds(self):
return self
class Weeks(TimeUnit):
@classmethod
def from_seconds(cls, seconds):
return cls(seconds/60/60/24/7)
def to_seconds(self):
return Seconds(self * 60 * 60 * 24 * 7)
x = 249129847219749821374782498
# Wat?
x - (Weeks.from_seconds(x).to_seconds()) # -> -2491687902
Comment est 249129847219749821374782498 - (Weeks.from_seconds(249129847219749821374782498).to_seconds()) == -2491687902
? Il finit par provoquer des erreurs lorsque j'essaie de représenter ce nombre de secondes en format de chaîne avec ma classe TimePeriod
.
class TimePeriod:
def __init__(self, *units):
self.seconds = Seconds(sum(unit.to_seconds() for unit in units))
def __repr__(self):
seconds = self.seconds
weeks = Weeks.from_seconds(seconds)
seconds -= weeks.to_seconds()
days = Days.from_seconds(seconds)
seconds -= days.to_seconds()
hours = Hours.from_seconds(seconds)
seconds -= hours.to_seconds()
minutes = Minutes.from_seconds(seconds)
seconds -= minutes.to_seconds()
seconds = Seconds(seconds)
return ' '.join(f'{unit} {unit.__class__.__name__}' for unit in (weeks, days, hours, minutes, seconds) if unit)
def __str__(self):
return repr(self)
Cela ressemble à un débordement d'époque. –