为何添加Try块后Clover POS数据统计结果与未使用时不符?
问题定位与修复方案
核心问题分析
两段代码的关键差异在于修改项统计逻辑的位置:
- 正常工作的代码中,修改项的统计逻辑嵌套在商品遍历的
for i循环内部——每处理一个商品,就同步检查并统计该商品的所有修改项,确保每个商品的修改项都被计数。 - 出现异常的代码中,修改项统计被移到了商品遍历循环的外部。此时变量
i的值是商品循环结束后的最后一个元素索引,导致每个订单仅统计最后一个商品的修改项,前面所有商品的修改项都被遗漏,直接造成修改项统计数值大幅减少。
外层新增的try...except块虽然能跳过空订单,但它的包裹范围过大,若商品遍历过程中出现任何KeyError(比如某商品缺失name字段),整个订单的统计都会被跳过。不过你提到商品销量统计始终正确,说明主要问题还是修改项循环的位置错误。
修复代码
保留空订单处理逻辑,同时将修改项统计放回商品遍历循环内部,并且优化空订单的判断方式(避免过度依赖try...except捕获宽泛异常,代码更直观):
for index in range(len(data_elements)): order = data_elements[index] print(index) # 直接判断订单是否包含有效商品列表,跳过空订单 if "lineItems" not in order or "elements" not in order["lineItems"] or not order["lineItems"]["elements"]: continue for i in range(len(order["lineItems"]["elements"])): item = order["lineItems"]["elements"][i]["name"] item = item.replace(" TPD","").replace("*","").replace("Bowl ","Bowl") if item in inventory_sold: inventory_sold[item] += 1 else: inventory_sold[item] = 1 # 每个商品单独处理修改项,放回循环内 try: mod_elements = order["lineItems"]["elements"][i]["modifications"]["elements"] for ind in range(len(mod_elements)): item_modification = mod_elements[ind]["name"] item_modification = item_modification.replace("(or Extra) ", "").replace("or Extra ", "").replace("Strawberries","Strawberry").replace("Substitute","Sub").strip() if item_modification in mod_dict: mod_dict[item_modification] += 1 else: mod_dict[item_modification] = 1 except KeyError: pass return [inventory_sold, mod_dict]
可选优化
为了让代码更健壮、简洁,还可以做以下调整:
- 使用
dict.get()方法避免直接索引引发的KeyError,比如order.get("lineItems", {}).get("elements", []) - 直接遍历列表元素而非通过索引,代码可读性更高:
for order in data_elements: print(data_elements.index(order)) line_items = order.get("lineItems", {}).get("elements", []) if not line_items: continue for item_element in line_items: item = item_element["name"].replace(" TPD","").replace("*","").replace("Bowl ","Bowl") inventory_sold[item] = inventory_sold.get(item, 0) + 1 mod_elements = item_element.get("modifications", {}).get("elements", []) for mod in mod_elements: mod_name = mod["name"].replace("(or Extra) ", "").replace("or Extra ", "").replace("Strawberries","Strawberry").replace("Substitute","Sub").strip() mod_dict[mod_name] = mod_dict.get(mod_name, 0) + 1
内容的提问来源于stack exchange,提问作者Lamar Mccloud
相关产品推荐
相关产品推荐

