Python 函数与模块:建立可测试的订单规则|课后复习
今天学会了什么
能把重复订单逻辑提取为有合同的函数和模块,用相同输入、输出及状态断言证明重构没有改变业务。
从调用处沿图解释实参怎样交给形参、局部计算何时结束、返回值交给谁,并指出可能修改外部对象的位置。
今天讲了什么(对照复习)
下面逐项对应课堂正文。先盖住右边那一栏,凭记忆回答;卡住了再翻回左边同名的小节。光说得出名字不算会,还要能讲清它会做什么、什么时候会失效。
| 课堂对应章节 | 必须能解释的机制与边界 |
|---|---|
| 先让旧办法真实失败;满足这些要求的方法叫函数;从重复金额块提取第一个函数 | 重复规则会造成漏改;按可复用、可独立验证的职责提取 def,而非按行数拆文件。定义不会执行函数体,调用才执行,规则只有一个可信实现位置。 |
| 动结构前,先冻结正确行为;重构循环:一次只提取一个职责 | 先确认旧行为正确,保留正常、错误、状态不变的基线。重构保持可观察行为;每次只提取一处,读 diff 并重跑同一批输入。 |
| 参数:调用者必须提供什么;return、print 和 None | 实参传给形参;位置参数依赖顺序,关键字参数明确含义。只传函数所需数据;print 面向人,return 面向调用者,未显式返回得到 None。 |
| 局部变量、外部名称和作用域;可变参数:传入字典后,函数可能改到原对象 | 局部赋值不自动覆盖外部同名变量;修改传入字典的内容却会影响原对象。优先显式参数,避免 global 隐藏依赖。 |
| 从第一个函数继续形成函数合同;中文 docstring 写什么;先纯规则,后受控状态动作 | 合同写职责、参数类型和单位、返回、异常、允许的副作用及非职责。纯计算/查询不改输入;支付/取消是受控副作用,先校验再修改。docstring 说明规则和边界。 |
| 断言:把预期写成可运行检查 | assert 对比实际与预期,覆盖金额、资源、状态和失败无半更新;开发断言不替代用户输入校验,也不能把原来错误的结果冻结成标准。 |
| 模块、包和入口副作用 | 模块通过 import 复用,依赖方向要清楚;用 main 保护交互入口,导入不创建订单、不读键盘。循环导入先画依赖图,再纠正职责。 |
| 同步调用:先看清函数什么时候返回 | 普通调用要等被调函数返回,调用方才继续使用结果;这描述顺序,不说明耗时。同步返回基础将用于 W02 理解异步等待。 |
出了问题:怎么发现、怎么修、怎么验证
只在你自己那份课程副本或专用实验数据上复验,把改之前和改之后的真实结果都留下来。
| 风险/现象 | 提前预防 | 怎样发现 | 怎样处理 | 怎样复验 |
|---|---|---|---|---|
| 只 print 导致调用者得到 None | 写明返回值合同 | 直接检查函数返回类型与金额 | 返回业务值,将显示放调用方 | 断言结果而非只看终端文字 |
| 隐藏全局状态或误改参数 | 标明可变对象和允许副作用 | 同一输入重复调用,比较调用前后对象 | 改成显式参数,收紧状态修改入口 | 计算不改原值,合法动作才改变状态 |
| 导入弹菜单或循环导入 | 模块职责单向,交互放 main | 单独 import,观察是否等待输入或报初始化错误 | 加入口保护并修正依赖方向 | 导入立即返回,直接运行仍可使用 |
| 重构时混入业务变化 | 先冻结正确基线,一次提取一处 | 对照相同输入、返回和状态的旧新结果 | 分开规则变更与结构改动 | 目标断言和全部旧断言均通过 |
闭卷自测
先自己答一遍,再去运行或翻回课堂核对;不确定的地方标出来,别用 AI 的答案顶掉你自己的第一次判断。
- 写出金额函数的最小合同:输入、输出、单位、失败与副作用。为什么不传整个订单仓库?
- 函数里重新给参数赋值与修改参数字典的键,有什么可观察差别?
- 只打印金额却不 return,会让调用方拿到什么?普通调用结束后从哪里继续执行?
- 导入规则模块会要求输入订单,应该从哪个边界修复?模块相互导入时先画什么图?
- 把数量限制的个人变化与重构分成两次修改,各自如何定义验收?
再看一眼真实业务
预习能观察到单笔和批量入口,却看不到平台源代码。用自己的函数调用图解释怎样让两个入口共享规则,写成设计建议,不写成对平台实现的结论。
今天留下什么,下节课怎么接着用
保留规则函数库、docstring、模块调用图、重构前后同输入对照、assert 检查和独立变更 diff。W01-D04 在这些边界上建立模型与 JSON 转换。
今天用普通 assert 建立回归,W01-D05 统一接入 pytest;装饰器实现与 async 语法不作为今天新增必做。
本次商城补强怎样复验
| 新增机制 | 商城用途 | 防错与复验 |
|---|---|---|
| 默认值/None | 订单备注 | 连续省略参数不共享;显式共享须说明 |
| 闭包与高阶函数 | 满减试算 | 两活动交替调用、门槛两侧运行 |
| *args/**kwargs与类型提示 | 调用参数约定 | 展开只传参,注解不做业务校验 |
| lambda | 方案按金额排序 | 单表达式无副作用,复杂规则仍用def |
逐项留下原输入、错误现象、最小修复和再次运行结果。若未运行,不写“问题已解决”。