Python字典缺失stock字段时标记为0,解决casefold属性错误
问题解决:字典对比时的casefold调用错误
错误原因
你的代码报错是因为data_1.get(att, {}).get('stock', {})这行逻辑存在问题:当data_1中不存在对应att的键时,第一个get返回空字典;接着第二个get找不到stock字段时,又返回空字典。而字典对象没有casefold方法,因此触发了'dict' object has no attribute 'casefold'错误。
修改方案
按照需求,未找到stock字段时要标记为0,对应STOCK_MAP里的'oos'(值为0)。所以需要把get('stock')的默认值设为'oos',而非空字典,确保casefold调用的对象始终是字符串。
修改后的代码
简洁版
STOCK_MAP = { 'oos': 0, 'low': 1, 'medium': 2, 'high': 3 } data_1 = {} data2 = { '123456789': { 'levels': '123456789', 'stock': 'LOW', } } # 调整get的默认值为'oos',保证casefold调用对象是字符串 t = any( STOCK_MAP[value['stock'].casefold()] > STOCK_MAP[data_1.get(att, {}).get('stock', 'oos').casefold()] for att, value in data2.items() ) print(t) # 输出True
更易读版(拆分逻辑,便于后续维护)
STOCK_MAP = { 'oos': 0, 'low': 1, 'medium': 2, 'high': 3 } data_1 = {} data2 = { '123456789': { 'levels': '123456789', 'stock': 'LOW', } } t = False for att, value in data2.items(): # 获取当前库存等级对应的数值 current_level = STOCK_MAP[value['stock'].casefold()] # 获取之前的库存等级,不存在则用oos(对应0) prev_item = data_1.get(att, {}) prev_stock = prev_item.get('stock', 'oos').casefold() prev_level = STOCK_MAP[prev_stock] if current_level > prev_level: t = True break # 符合any逻辑,找到一个满足条件就停止循环 print(t) # 输出True
效果说明
修改后,当data_1中没有对应商品的库存数据时,会默认使用'oos'对应的0值进行对比,既避免了报错,也满足了“未找到变量时标记为0”的需求。运行代码后会正确输出True,因为当前库存等级LOW(对应1)高于默认的0值。
内容的提问来源于stack exchange,提问作者PythonNewbie
相关产品推荐
相关产品推荐

