fix(solve): random_walk 失败路径的 UnboundLocalError;第二轮口径收口
口径由用户第二轮改定;Codex 修一处真 bug + 工程侧。 - 真 bug:call_params 写在 try 里、却在 except 被引用,5 种失败输入 5 个全炸 UnboundLocalError (本该返回 success=False 的 Result,变成把异常抛给调用方)。按原意前移到 try 之前,未改口径; 失败时照样带上 n_steps / n_paths / start / random_state - 用户口径:n_steps/n_paths 拆 TypeError/ValueError;加 steps 形状与 NaN 两条校验; 默认步长改 rng.choice([-1.0, 1.0]);params 补 random_state;metrics 改 mean_terminal/std_terminal - 工程:docstring 同步(Returns 的 metrics、Raises 的分工、去掉已删的 start 校验);+3 条测试 (失败也必须返回带 params 的 Result、NaN 判失败、终点 std ~= sqrt(t)),solve 段 41 条 - 验证:208 收集 / 177 passed / 31 skipped / 0 xfail,ruff 0,pyright 0 - docs:STATUS 决策 54 + 3 条新口径;CHANGELOG;易错点 26
This commit is contained in:
1 parent
8ec08ea9ce
commit
6fca82e3fc
5 files changed
+160
-37
No files matched your search
@@ -47,6 +47,7 @@
|
||||
| 23 | 体积/宽度这种"看着总为正"的量也会减反,维度奇偶还会把符号错误藏住 | 2026-10-05 |
|
||||
| 24 | 默认参数路径从没被执行过 —— 默认采样器用了库不接受的参数 | 2026-10-05 |
|
||||
| 25 | 两个维度相等时,转置的形状检查会静默通过 | 2026-10-05 |
|
||||
| 26 | `except` 用到的变量在 `try` 里才赋值 —— 每条失败路径都炸 | 2026-10-05 |
|
||||
| 22 | 失败结果的 `message` 被包装层无条件覆盖 —— 对外永远报"成功" | 2026-10-05 |
|
||||
| 23 | 体积/宽度这种"看着总为正"的量也会减反,维度奇偶还会把符号错误藏住 | 2026-10-05 |
|
||||
|
||||
@@ -435,3 +436,20 @@
|
||||
对外部传进来的批量数组显式校验 `shape == (n, d)`,别指望后面的运算替你把关。
|
||||
- 首次:2026-10-05|复发:0
|
||||
|
||||
|
||||
|
||||
### 26. `except` 用到的变量在 `try` 里才赋值 —— 每条失败路径都炸
|
||||
|
||||
- 现象:`random_walk` 把 `call_params = {...}` 写在 `try:` 里面,但 `except` 分支要 `params=call_params`。
|
||||
于是**每一个失败路径**都变成 `UnboundLocalError: cannot access local variable 'call_params' where it is not associated with a value`
|
||||
—— 实测 5 种失败输入(形状不对 / 增量含 NaN / 采样器抛异常 / `start` 非数值 / 返回 1-D 数组)**5 个全中**,
|
||||
本该返回 `success=False` 的 `Result`,变成了把异常直接抛给调用方。
|
||||
- 为什么会错:写的时候脑子里只过"成功路径",`except` 是照上一版的结构留下来的;
|
||||
**异常分支只有真抛异常才会执行**,正常跑一遍、ruff、pyright 全都看不见(当时两个都 0 error)。
|
||||
与第 24 条(默认路径没跑过)是同一类:**分支覆盖靠"我以为",不靠执行**。
|
||||
还有一层:`params` 里那几个值(`n_steps` / `n_paths` / `start` / `random_state`)在 `try` 之前就已经定了,
|
||||
它们本来就**不属于**"可能失败的计算",放进去纯属位置错误。
|
||||
- 以后怎么防:① 写 `except` 时,逐个变量问"它是在 `try` 里才被赋值的吗"——**失败的返回要在 `try` 之前准备好**;
|
||||
② 每写一个 `try`,必须配一个**注定失败**的用例(`assert r.success is False`),专门喂 `except` 分支;
|
||||
③ 包装层的失败结果也要带 `params`,出问题才追得回去。
|
||||
- 首次:2026-10-05|复发:0
|
||||
Reference in new issue
Block a user