나는 숙제를 할 때 친구를 돕고 있는데, 사용자가 임의의 초를 입력하고 주, 일, 시간, 분, 초 단위로 그 시간을 나타내는 문자열을 표시해야합니다.왜 일부 큰 정수를 나눠서 파이썬에서 이상한 결과를 반환합니까?
나는 int
으로부터 상속받은 TimeUnit
클래스를 가지고 있으며 음수의 시간 단위 생성을 허용하지 않습니다. 그런 다음 문자열을 표시하는 TimeUnits
으로 구성된 TimePeriod
클래스를가집니다.
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
방법 249129847219749821374782498 - (Weeks.from_seconds(249129847219749821374782498).to_seconds()) == -2491687902
입니다 :
특히, 그것은 나를 혼란이 현상은입니까? 내 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)
획기적인 오버플로 소리가납니다. –