Python家务追踪器(Chore Tracker)代码报错求助:参数缺失与键错误
家务追踪器(Chore Tracker)代码错误排查与修复
问题背景
尝试用Python开发家务追踪器,核心需求为:输入家务名称与耗时并存入字典,调用print_summary()方法可输出各家务的累计耗时及总耗时。但开发过程中先后遇到两个错误:
- 第一段代码运行时提示「ChoreTracker.add_hours()缺少必需的位置参数number_of_hours」
- 修改后的第二段代码触发KeyError
第一段错误代码问题分析
class ChoreTracker: def __init__(self): self.tracker = {} def add_hours(self,chore_name, number_of_hours): menu_char ='' while menu_char != 'n': self.chore_name = input('What is the name of the chore?') self.number_of_hours = float(input('How many hours was the chore?')) self.tracker.append({chore_name},{number_of_hours}) menu_char = input('Do you want to add another chore? (y/n)') def print_summary(): total_chore_hours = 0 for each in tracker: total_chore_hours = number_of_hours + total_chore_hours print(f'{chore_name}: {number_of_hours:.2f} hours') print(f'Total: {total_chore_hours:.2f} hours') ChoreTracker.add_hours('sweeping', 0.75) ChoreTracker.add_hours('laundry', 1.5) ChoreTracker.add_hours('working', 11.5) ChoreTracker.add_hours('mopping', 0.5) choretracker.print_summary()
存在的核心问题:
- 直接调用类方法而非实例方法:
ChoreTracker.add_hours()是实例方法,必须先创建类的实例再调用,直接调用会缺少self参数,导致参数缺失错误。 - 字典误用列表方法:
self.tracker是字典类型,不能使用列表的append()方法,字典需要通过键值对赋值存储数据。 - 方法缺少
self参数:print_summary()没有定义self参数,无法访问实例的tracker属性,且循环中使用的chore_name、number_of_hours变量未定义。 - 未定义实例变量:最后调用
choretracker.print_summary()时,choretracker变量从未创建。
第二段错误代码问题分析
class ChoreTracker: def __init__(self): self.chores = {} def add_hours(self,chore_name, number_of_hours): menu_char ='' while menu_char != 'n': self.chores["Chore_Name"]:(chore_name) self.chores["Number_of_Hours"]:(number_of_hours) menu_char = input('Do you want to add another chore? (y/n)') return chore_name, number_of_hours def print_summary(self): total_chore_hours = 0 for each in self.chores['Key']: total_chore_hours = self.chores.get('number_of_hours') + total_chore_hours print(f'{chore_name}: {number_of_hours:.2f} hours') print(f'Total: {total_chore_hours:.2f} hours') tracker = ChoreTracker() tracker.add_hours('sweeping', 0.75) tracker.add_hours('laundry', 0.5) tracker.add_hours('working', 6) tracker.add_hours('mopping', 0.5) tracker.add_hours('laundry', 1) tracker.add_hours('working', 5.5) tracker.print_summary()
存在的核心问题:
- 无效的字典赋值语法:
self.chores["Chore_Name"]:(chore_name)不是正确的字典赋值方式,应该用=;且每次都用相同的键,会覆盖之前的数据,无法存储多个家务。 - KeyError根源:
print_summary()中循环self.chores['Key'],但self.chores中不存在'Key'这个键,直接触发KeyError。 - 变量未定义:循环中使用的
chore_name、number_of_hours未定义,且self.chores.get('number_of_hours')无法正确获取对应家务的耗时。 - 逻辑混乱:
add_hours方法既接收外部传入的参数,又在循环中忽略这些参数,无法实现「累计同一家务耗时」的需求。
修复后的完整代码
class ChoreTracker: def __init__(self): # 字典结构:键=家务名称,值=累计耗时 self.chores = {} def add_hours(self, chore_name, number_of_hours): """通过参数添加家务耗时,支持累计同一家务的时长""" if chore_name in self.chores: self.chores[chore_name] += number_of_hours else: self.chores[chore_name] = number_of_hours def add_hours_via_input(self): """通过用户输入的方式添加家务耗时""" menu_char = '' while menu_char.lower() != 'n': chore_name = input('请输入家务名称:') try: number_of_hours = float(input('请输入该家务耗时(小时):')) self.add_hours(chore_name, number_of_hours) except ValueError: print('请输入有效的数字作为耗时!') menu_char = input('是否继续添加其他家务?(y/n):') def print_summary(self): """输出所有家务的耗时汇总及总耗时""" total_hours = 0.0 print('家务耗时汇总:') for chore, hours in self.chores.items(): print(f'{chore}: {hours:.2f} 小时') total_hours += hours print(f'总耗时:{total_hours:.2f} 小时') # 使用示例 tracker = ChoreTracker() # 方式1:手动传入参数添加家务 tracker.add_hours('扫地', 0.75) tracker.add_hours('洗衣', 1.5) tracker.add_hours('工作', 11.5) tracker.add_hours('拖地', 0.5) # 累计同一家务的耗时 tracker.add_hours('洗衣', 1.0) # 方式2:通过用户输入添加家务(可选,取消注释即可使用) # tracker.add_hours_via_input() # 输出汇总信息 tracker.print_summary()
修复要点说明
- 拆分功能逻辑:将「通过参数添加」和「用户输入添加」拆分为两个方法,逻辑更清晰,满足不同使用场景。
- 正确的字典存储:用家务名称作为键,累计存储耗时,避免数据覆盖,同时支持同一家务的时长累加。
- 规范的实例方法:所有方法都通过
self访问实例属性,确保能正确读取和修改家务数据。 - 错误处理:对用户输入的耗时做格式校验,避免非数字输入导致程序崩溃。
- 清晰的汇总输出:遍历字典键值对,正确计算总耗时并格式化输出。
内容的提问来源于stack exchange,提问作者Nicko Toumbas
相关产品推荐
相关产品推荐

