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

嵌套字典导航与复制: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]

关键修正点

  1. 避免KeyError:在向delproduct添加产品前,先判断订单是否已存在于字典中,不存在则初始化空字典/列表;
  2. 合并冗余逻辑:先判断订单是否包含召回产品,再决定是整单删除还是筛选无关产品,无需分开处理单/多产品订单;
  3. 完善移除流程:先处理整单删除,再处理订单内的产品删除,可选删除空订单。

内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 09:27:45