这一课的交付物
修好一个购物车计算函数:用整数“分”表示金额,数量必须为正整数,优惠不能超过商品总价。最后你应有可运行的 cart.py、通过的样例,以及能解释的代码差异。
在自己电脑新建空目录 ai-cart-lab,用已安装的 Python 3 打开练习。这里只写本地函数,不调用模型 API、不处理真实订单。使用 Codex 时选择这个练习目录;如果在普通聊天界面练习,就复制代码与要求,自己保存并运行结果。
起始代码:先复现错误
把下面内容保存为 cart.py,运行 python cart.py。这段是故意有缺陷的练习输入:
def total(price_cents, quantity, discount_cents=0):
return price_cents * quantity - discount_cents
print(total(1990, 2, 500))
print(total(1990, 0))
print(total(1990, 1, 3000))
应看见 3480、0、-1010。第一条符合预期,后两条暴露问题:买零件商品、优惠后负数,都不应该悄悄通过。先保留这个复现结果,别只向助手说“代码不对”。
给 Codex 的完整任务
请读取练习目录中的 cart.py,修复 total 函数。
金额单位统一为整数分,price_cents 和 discount_cents 必须是非负整数;quantity 必须是正整数;拒绝布尔值和浮点数。优惠不能超过原总价,不符合时抛 ValueError。
保持函数名与参数顺序,不添加第三方依赖,不改成浮点元。
先说明当前三个样例分别暴露什么问题,再修改代码并补充可运行的断言。
运行本地验证,报告实际命令与结果;如果没有执行能力,请明确说明。
这里给出行为、边界和允许范围。助手若开始搭建支付系统、数据库和网页,可以直接要求回到这个函数;它们不属于本课交付。
参考实现:先自己尝试,再对照
以下整段保存为 cart.py,可独立运行:
def total(price_cents, quantity, discount_cents=0):
values = (price_cents, quantity, discount_cents)
if any(type(value) is not int for value in values):
raise ValueError("金额和数量必须为整数")
if price_cents < 0 or quantity <= 0 or discount_cents < 0:
raise ValueError("金额非负,数量必须大于零")
subtotal = price_cents * quantity
if discount_cents > subtotal:
raise ValueError("优惠超过商品总价")
return subtotal - discount_cents
assert total(1990, 2, 500) == 3480
assert total(0, 1) == 0
assert total(1990, 1, 1990) == 0
for args in [(1990, 0), (1990, 1, 3000), (True, 1), (1.5, 2), (-1, 1)]:
try:
total(*args)
except ValueError:
pass
else:
raise AssertionError(f"非法输入未拒绝:{args}")
print("购物车正常与边界样例通过")
为什么不用 isinstance(value, int)?Python 的布尔值是 int 的子类,本课约定拒绝 True,因此检查确切类型。为什么用整数分?它把本课的金额运算限制在整数范围,避免将浮点精度问题混入练习。
怎样看代码差异
先看函数签名有没有变,再看新增校验是否在计算前执行。最后逐条对应需求:负价格、零数量、浮点、布尔、超额优惠都应被拒绝。不要因为多了很多断言就默认完整;读出每条断言验证的行为。
如果助手把超额优惠自动截为零,而你要求报错,发送:
当前实现把超额优惠后的金额自动变成零,这不符合本题。请改为抛 ValueError,并保留“优惠刚好等于总价时返回零”的合法情况。只改相关校验与测试,再运行全部已有样例。
这给出了一个反例和一个相邻合法例,避免修复时把全额优惠也误禁掉。
自测与答案
程序没有报错就代表正确吗?不是,起始代码能运行,却输出了不允许的负金额。
加练:新增 maximum_quantity=99 的约束,但保持旧调用能工作。先自己写 99 与 100 的预期行为,再让助手实现,最后确认旧测试仍通过。
能力边界
本课检验本地参考代码与审阅方法,不代表已经比较过各 Codex 模型的成功率。若助手声称“测试通过”,应能给出实际运行证据,而不是把预期输出当运行日志。
来源与内容说明
AIScope 中文手册 · AIScope 编辑