Python类与对象:Duration类extendBy方法天数计算错误求助
Duration类extendBy方法天数计算错误排查
问题现象
运行测试断言时,返回结果的周数、小时数符合预期,但天数计算始终错误,相关代码与测试用例如下:
原始问题代码
from __future__ import annotations class Duration: def __init__(self): self.hours = 0 self.days = 0 self.weeks = 0 def extendBy(self, hr: int) -> None: # 疑似问题方法 print({self.weeks}, {self.days}, {self.hours}) if hr + self.hours < 24: self.hours = hr if hr + self.hours > 23: self.hours = ((hr + self.hours) % 24) self.days += int((hr - self.hours) // 24) if self.days > 6: if self.days % 7 == 0: self.weeks = int(self.days // 7) self.days = 0 else: self.days = self.days % 7 self.weeks = int(self.days // 7) print({self.weeks}, {self.days}, {self.hours})
测试用例
a = Duration() a.extendBy(25) assert (a.weeks == 0 and a.days == 1 and a.hours == 1) a.extendBy(24) assert (a.weeks == 0 and a.days == 2 and a.hours == 1) a.extendBy(7*24) assert (a.weeks == 1 and a.days == 2 and a.hours == 1)
错误根因
方法内共有4处逻辑缺陷:
- 小时计算逻辑错误:总小时数小于24时,直接将
self.hours赋值为传入的hr,没有累加原有小时值;且两个判断小时范围的if为独立分支,未覆盖等于24的边界,会触发重复逻辑执行 - 天数增量计算错误:计算新增天数时,仅用传入的
hr减去新的小时值计算,未计入原有小时数的贡献,增量计算结果偏小 - 周数计算逻辑错误:非整除7的分支中,先对天数取模再计算周数,取模后天数必然小于7,计算出的周数永远为0
- 赋值逻辑错误:计算周数时直接覆盖
self.weeks的原有值,没有做累加,多次调用时周数计算会出错
修正方案
使用Python内置divmod函数直接获取整除结果和余数,简化进位逻辑,避免手动计算取模、整除的错误,修正后代码如下:
from __future__ import annotations class Duration: def __init__(self): self.hours = 0 self.days = 0 self.weeks = 0 def extendBy(self, hr: int) -> None: # 先累加小时,计算小时向天的进位 total_hours = self.hours + hr add_days, self.hours = divmod(total_hours, 24) self.days += add_days # 再计算天向周的进位 add_weeks, self.days = divmod(self.days, 7) self.weeks += add_weeks
修正后运行全部测试用例,所有断言均可正常通过。
内容的提问来源于stack exchange,提问作者user19159910
相关产品推荐
相关产品推荐

