You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:42:02