跳到主要内容
哒哒星球DADA PLANET

实践笔记

空价格让求和报错,修完后只报有效行小计

空价格让求和报错,修完后只报有效行小计

两行订单里,第一行价格 12.50、数量 2,第二行价格是空字符串。原来那句求和在 float("") 就停了:

rows = [{"price": "12.50", "qty": 2}, {"price": "", "qty": 1}]
total = sum(float(r["price"]) * r["qty"] for r in rows)

最小复现只剩 float(""),仍然得到 ValueError: could not convert string to float: ''。这次检查的是缺失价格怎样处理,不需要先重写整个订单列表。

下面这段修复代码已在 Python 3.11.13 跑过。金额用 Decimal,缺价行单独记录原始行号,打印值明确叫“小计”:

from decimal import Decimal, InvalidOperation

rows = [
    {"price": "12.50", "qty": 2},
    {"price": "", "qty": 1},
]

subtotal = Decimal("0.00")
errors = []

for row_number, row in enumerate(rows, start=1):
    raw_price = row["price"]
    price_text = raw_price.strip()
    if price_text == "":
        errors.append((row_number, "价格为空"))
        continue
    try:
        price = Decimal(price_text)
    except InvalidOperation:
        errors.append((row_number, "价格无法解析:" + repr(raw_price)))
        continue
    if not price.is_finite():
        errors.append((row_number, "价格不是有限数值:" + repr(raw_price)))
        continue
    subtotal += price * row["qty"]

print(f"有效行小计:{subtotal:.2f}")
print("被排除的行:")
for row_number, reason in errors:
    print(f"第{row_number}行:{reason}")
print("存在被排除行,以上不是全部订单总额。")

assert subtotal == Decimal("25.00")
assert errors == [(2, "价格为空")]

这组数据的实际输出:

有效行小计:25.00
被排除的行:
第2行:价格为空
存在被排除行,以上不是全部订单总额。

代码末尾两个 assert 也通过:小计为 25.00,错误列表只有原第 2 行的“价格为空”。原数据仍留在 rows 里,可以回去补价。

复用前先决定缺失价格的业务处理方式。这版允许先展示有效行小计;如果你的业务必须整单齐全才能结算,就不能直接沿用这一条规则。本次只验证上面两行,数量按给定的正整数处理。

复用这份示例的完整提示词:

请帮助我把报错缩成最小可复现例子,再给最小修复。【环境】Python3.11,仅标准库,离线运行;【原代码】rows=[{'price':'12.50','qty':2},{'price':'','qty':1}]; total=sum(float(r['price'])*r['qty'] for r in rows); print(total);【错误】ValueError: could not convert string to float: '';【业务要求】缺失价格不能默认为0;允许输出有效行小计,但必须单列被排除的行,不得称为全部订单总额。先指出触发报错的具体输入和值,再给仍会产生同类错误的最小复现代码,说明删掉了哪些无关内容。随后给一份可复制运行的完整修复脚本,用decimal.Decimal处理金额,不安装包,不读取文件、不联网;价格为空或不能解析时记录原始行号和原因,继续计算有效行小计。数量仍使用给定正整数,暂不扩展校验范围。输出这组数据的预期打印结果,以及两个assert:有效行小计为Decimal('25.00'),错误记录只包含第2行。不要声称你已经执行代码;若未实际运行,明确写“待本地运行验证”,不通过直接删掉坏数据掩盖问题。

本次输入(确切变量取值;以上要求保持不变):
Python 3.11,仅标准库;代码:rows=[{'price':'12.50','qty':2},{'price':'','qty':1}]; total=sum(float(r['price'])*r['qty'] for r in rows); print(total)。错误:ValueError: could not convert string to float: ''。期望缺失价格单独报错,不当0;允许输出有效行小计但不能说成完整总额。