Python 自动化接单实战(十):从需求报价到验收交接的完整清单 本篇复用上一篇生成的dist/data-cleaner.exe、build-manifest.json、tests/与诊断说明并读取前面累积的示例配置和验收样本。新增verify_delivery.py只核对交付包不重新实现业务。上一篇构建产物就是本篇验收输入最终把十篇同一工程闭合起来。一、把一句需求变成可验证规格from__future__importannotationsimporthashlibimportjsonfromdataclassesimportdataclass,asdictfrompathlibimportPathdataclass(frozenTrue)classAcceptance:input_glob:strrequired_fields:tuple[str,...]max_files:intoutput_format:strdefdigest(path:Path)-str:hasherhashlib.sha256()withpath.open(rb)ashandle:forchunkiniter(lambda:handle.read(65536),b):hasher.update(chunk)returnhasher.hexdigest()defmain()-int:specAcceptance(input/*.csv,(id,amount),500,xlsx)executablePath(dist/data-cleaner.exe)ifnotexecutable.is_file():print(verify_failed missingdist/data-cleaner.exe)return2manifestjson.loads(Path(build-manifest.json).read_text(encodingutf-8))actualdigest(executable)ifactual!manifest[artifact_sha256]:print(verify_failed reasondigest_mismatch)return2testsjson.loads(Path(test-results.json).read_text(encodingutf-8))iftests[failed]!0ornotPath(DIAGNOSTICS.md).is_file():print(verify_failed reasonevidence)return2result{spec:asdict(spec),sha256:actual,tests:tests[passed]}Path(delivery.json).write_text(json.dumps(result,ensure_asciiFalse,indent2),encodingutf-8)print(fverified artifact{executable}tests{tests[passed]}sha256{actual[:12]})return0if__name____main__:raiseSystemExit(main())输出示例verified artifactdist/data-cleaner.exe tests18 sha25623c91b4e271a规格还应补充样例、异常处理、运行环境、数据保密、速度预期和不在范围内的事项。没有样例时先做付费或明确范围的探索阶段。二、报价按风险与交付物拆分固定范围可以拆为需求确认、最小样品、完整实现、验收修复和交接支持。动态站点、未知 PDF 版式、第三方接口权限等不确定项单独列出避免用一个总价掩盖风险。三、用脚本生成交付清单frompathlibimportPath required[README.md,config.example.json,tests,CHANGELOG.md]missing[namefornameinrequiredifnotPath(name).exists()]ifmissing:raiseSystemExit(missing: , .join(missing))print(delivery checklist passed)成功输出delivery checklist passed客户还应实际在目标机器上用脱敏验收样本完成一次安装、运行、核对输出和查看错误日志。源码、可执行文件、配置示例、测试、版本与支持期限全部确认后再交接。四、清单检查存在证据检查内容路径清单能发现漏装文件却不能证明文件属于本次构建。因此verify_delivery.py同时读取上一篇build-manifest.json的摘要、test-results.json的失败数和DIAGNOSTICS.md。任一证据不一致就返回非零退出码只有全部通过才生成delivery.json。五、为什么验收条件必须先于报价“支持 Excel”“抓取网页”都无法直接验收因为文件版式、页面范围、数据量和错误策略尚未定义。先写输入样例、输出字段、允许误差、目标环境与失败处理才能估算工作量。未知 PDF 版式、动态站点权限和第三方接口稳定性应拆成探索阶段以小样本结论决定后续固定范围。报价不是代码行数乘单价而是对交付物与风险分配的说明。实现、测试、打包、文档、验收修复和支持期限分别列项客户新增字段或更换数据源时可以判断属于缺陷还是变更。记忆点是验收是需求的校验和。没有它双方拿着相似描述也可能期待不同结果。六、交接完成的判据文件存在只证明拷贝发生摘要一致才证明客户拿到验收版本自动测试通过只证明固定规则成立客户在目标机器完成一次输入、运行、核对输出和查看错误日志才证明操作链闭合。交接清单还应记录版本、构建摘要、配置说明、数据保留策略、已知限制和支持截止日期。这个递进工程从 071 的config.csv与clean_record()出发依次生成正常表、网页结果、PDF 清单、同步数据库、浏览器下载摘要、日报、测试日志、Windows 构建最后进入本篇delivery.json。每一步都把上篇产物当输入也为下篇留下稳定契约。以后需求变化时可以定位受影响的边而不是推倒整个项目。最终确认还要覆盖数据退出机制。客户样本、浏览器状态、失败截图和日志各自有保留期限项目结束后按约定归还或删除并留下不含业务内容的删除记录。源代码授权范围、第三方依赖许可证、账号权限撤销和后续维护入口也写入交接单。交付成功不仅是客户拿到文件也是开发者不再持有不必要的访问权。 本文用可验证规格、风险拆价和交付清单收束全系列形成从最小样品到稳定交接的完整路径。 回看这十篇你最想先把哪一类重复工作做成可交付的 Python 工具 收藏《Python 自动化接单实战》完整系列后续将继续补充真实脱敏案例与工程化模板。参考来源Dev.toThe AWS Cleanup We Keep Putting OffHacker NewsHow is the Bun Rewrite in Rust going?