嵌套字典导航与复制:BigCommerce订单脚本产品过滤故障排查
解决方案
核心问题分析
你需要构建订单-产品层级的delproduct字典来记录需要移除的无关产品,之前的写法触发KeyError是因为直接访问delproduct[order]时,该订单键尚未在字典中初始化。同时原代码中对单产品/多产品订单的判断逻辑冗余,可以合并简化。
实现方案1:字典嵌套格式(匹配你理想的delproduct结构)
def remove_unneeded_orders(): deldict = {} # 存储需要整单删除的订单(无召回产品的订单) delproduct = {} # 存储需移除的产品:{订单号: {产品ID: 产品信息}} recall_product = "目标SKU" # 替换为你的召回产品SKU for order in productdict: has_recall = False # 先检查当前订单是否包含召回产品 for product in productdict[order]: if productdict[order][product]['Product_SKU'] == recall_product: has_recall = True break if not has_recall: # 订单里没有召回产品,直接标记整单删除 deldict[order] = order continue # 订单有召回产品,筛选需要移除的无关产品 for product in productdict[order]: if productdict[order][product]['Product_SKU'] != recall_product: # 初始化订单对应的字典(避免KeyError) if order not in delproduct: delproduct[order] = {} delproduct[order][product] = productdict[order][product] # 执行移除操作 # 1. 删除整单 for order in deldict: del productdict[order] del orderdict[order] # 2. 删除订单内的无关产品 for order in delproduct: for product in delproduct[order]: del productdict[order][product] # 可选:如果删除后订单无产品,也删除整单 if not productdict[order]: del productdict[order] del orderdict[order]
实现方案2:订单-产品列表格式(更简洁,避免嵌套字典)
如果更倾向于{订单号: [产品ID列表]}的格式,代码可以简化:
def remove_unneeded_orders(): deldict = {} delproduct = {} recall_product = "目标SKU" for order in productdict: has_recall = False product_list = [] for product in productdict[order]: if productdict[order][product]['Product_SKU'] == recall_product: has_recall = True else: product_list.append(product) if not has_recall: deldict[order] = order else: if product_list: # 只有存在要删除的产品时才记录 delproduct[order] = product_list # 执行移除 for order in deldict: del productdict[order] del orderdict[order] for order in delproduct: for product in delproduct[order]: del productdict[order][product] if not productdict[order]: del productdict[order] del orderdict[order]
关键修正点
- 避免KeyError:在向
delproduct添加产品前,先判断订单是否已存在于字典中,不存在则初始化空字典/列表; - 合并冗余逻辑:先判断订单是否包含召回产品,再决定是整单删除还是筛选无关产品,无需分开处理单/多产品订单;
- 完善移除流程:先处理整单删除,再处理订单内的产品删除,可选删除空订单。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

