用 Claude Code 实战 Python · 第 03 题 · English

第 3 课:按测试驱动一次有边界的变更

检查点 l0310 分测试套件判定Claude Code 2.x

让 Agent 在契约约束下修改 starter——最小变更、不新增依赖、一次一组测试从红到绿。

在用 Agent 做题?一句话开始整门课程:

Read https://flypython.com/skills/flypython/SKILL.md and start the FlyPython course `hands-on-python-with-claude-code`.

第 3 课:按测试驱动一次有边界的变更

目标

starter 通过一系列有边界的变更通过全部九个测试,并且在不先看 solution 的前提下,你能解释 Agent 产出的每一个 diff。

为什么要有这一课

这是最容易被跳过、也最练真功夫的一课。看 Agent 用一次巨型重写让 七个失败测试全部通过,你什么都学不到;监督七个小 diff、每个都锚定 一条契约线,你学到的是如何让 AI 写的代码仍然属于你。

课程内容

对 Agent 说:“按 TASK.md 修改 starter/report_tool.py。一次只处理一组 失败测试:先 JSON 加载,再校验隔离,再舍入,再原子写入,最后端到端。 每完成一组就运行测试套件,给我看 diff,再继续。

守住契约的边界:

  • 只有 starter/report_tool.py 可以变。diff 若触碰 tests/solution/scenario/,停下来问为什么。
  • 不引入标准库之外的新依赖——也不引入当前变更用不到的 import。
  • 每次变更只应指向一条契约线。拒绝顺手重构(“既然改到这里我把…… 也重命名了”)。
  • Agent 想改测试?答案是不。测试就是契约;动的是代码。

每组之后运行套件:

PYTHONPATH=starter python -m unittest discover -s tests -v

失败数应逐组下降:7 → 5 → 4 → 3 → 2 → 0。

练习

最后一组自己做。当只剩端到端测试时,亲手写下 run_scenario/main 的修复(它们很小),然后跑完整套件。看懂 Agent 的 diff 是学习;亲手 写最后十行是内化。

检查点

python verify.py starter --expect-failure   # 此时应当报"预期失败但没有失败":starter 已经通过
python verify.py starter                    # 必须通过全部九个测试

第一条命令失败是好消息——说明 starter 不再处于”正确的未完成”状态。 然后回答:哪个变更最小?哪个你自己会做过头?

预期证据

从 7 个失败降到 0 的测试输出记录,加上各步 diff。只有当你的 starter 通过之后才允许打开 solution/——对比两种实现,记下已审核方案做到了 而你没有做到的一件事。

提示

卡住了?逐条打开。

提示 1 —— 这个检查点考什么

门控是 python verify.py starter——九个测试在你的 starter 上全绿。一次只推一组失败:先 load_records(csv/json/ValueError),再 build_report,再 write_report,最后 main

提示 2 —— 套件真正断言的坑

布尔值不是数字——isinstance(True, int) 为 True,要显式排除。分组总计保留两位小数。total = valid + invalid 在全部行都非法时也必须成立。

提示 3 —— 原子写就是原子写

write_report 必须用同级临时文件加 os.replace,成功时不能留下 .tmp——套件检查的是文件系统,不是你的意图。还红就直接跑 unittest 看失败名。

提交

做完了?记录它。

提交 verify.py progress 为本检查点打印的 8 位认领码——浏览器里交,或让你的 Agent 直接交。

浏览器

提交认领码

你的 Agent自动提交

让 Agent 解题并自动提交

把这题交给它(悬停出现复制按钮)——解题、验证、提交全程自动:

请完成 FlyPython 挑战课程「用 Claude Code 实战 Python」(course id course-claude-code)的检查点 l03。
机读简报:https://flypython.com/api/challenges/hands-on-python-with-claude-code
打开课程文件夹,先读 TASK.md——它就是契约。
规则:最小变更、不新增依赖、绝不修改 tests/ 或 solution/。
用 python verify.py 检查直到门控通过,把每个认领码告诉我。
目标:只做检查点 l03 这一道题,完成后立即提交。

用你Agent 页生成的令牌(环境变量 FLYPYTHON_TOKEN),它可以直接记录结果:

curl -X POST https://flypython.com/api/claims \
  -H "Authorization: Bearer $FLYPYTHON_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"claims":[{"course":"hands-on-python-with-claude-code","checkpoint":"l03","code":"<8-char code>"}]}'

或一次性安装完整的 FlyPython Agent Skill,连粘贴都省了。

官方示范 · Pro

看一个真人怎么带 Agent 做这道题

本检查点的官方示范——任务契约怎么交、什么时候叫停 Agent、未剪裁的失败纠正、verify.py 过闸全程。含在 Pro 内;无免费试看,题目本身仍免费。

文件

starter 与验证器

解题在你的机器上运行——Agent 通过 /api/challenges/hands-on-python-with-claude-code/files 自己取回课程文件,你无需手动下载。想直接读源码?在 GitHub 上查看文件夹 ↗