Python类方法**kwargs入参无法完整遍历仅处理首个键值对问题
问题排查与修复方案
核心错误原因
add_food方法没有遍历完所有参数的根本原因是:你在for循环的if和else分支内都直接写了return语句。
- Python函数一旦执行到
return就会立刻终止运行、返回对应值,不会继续执行后续代码 - 所以循环处理第一个传入的餐品(Big_Mac)时,走到分支逻辑触发return,方法直接退出,后面的
Spicy_chicken_burger根本没有进入处理逻辑
另外代码里还有两个隐藏问题:
__init__方法中self.menu初始值设为None,如果实例化后忘记手动给menu赋值就调用add_food,会直接抛出AttributeError,初始化时直接设为空字典更稳妥- 原逻辑只要碰到一个已存在的餐品就直接返回,后续待添加的餐品都不会被处理,不符合批量添加的预期
修复后的可运行代码
class FastFoodChain(): def __init__(self, name): self.name = name self.menu = {} # 初始化直接赋值为空字典,避免None类型报错 print(f"{name} established! Congrats!") def add_food(self, **foods): process_results = [] # 用列表收集所有餐品的处理结果 for food, price in foods.items(): # 字典直接判断key是否存在即可,不需要额外调用.keys() if food in self.menu: process_results.append(f"{food} is already in the menu") else: self.menu[food] = price process_results.append(f"{food} added to the menu") # 所有餐品全部处理完成后,统一返回结果 return "\n".join(process_results) # 功能测试 McDonalds = FastFoodChain("McDonalds") McDonalds.menu = {'fries': 3, 'chicken_nuggets': 4, 'cheeseburger': 4.5, 'cola': 2.5, 'chicken_burger': 5} print(McDonalds.add_food(Big_Mac = 6, Spicy_chicken_burger=4))
运行后输出:
McDonalds established! Congrats! Big_Mac added to the menu Spicy_chicken_burger added to the menu
此时打印McDonalds.menu可以看到两个新品都已经成功加入菜单。
**kwargs使用注意点
**kwargs接收的关键字参数会被自动组装为字典,遍历、取值逻辑和普通字典完全一致- 遍历
**kwargs组装出的字典时,不要在循环内部随意写return,除非明确需要在满足特定条件时立刻终止整个函数 - 如果需要返回循环内所有步骤的处理结果,可以先把结果存在列表/字典中,等循环全部执行完成后再统一返回
内容的提问来源于stack exchange,提问作者Yixing Wang
相关产品推荐
相关产品推荐

