fix(shadow): build_price_getter 兜底自崩根治——df 预绑 None。09-14 shadow_57 002646 连刷 356+ 次「free variable 'df' referenced before assignment in enclosing scope」:日线 get_price 抛异常时,except 兜底里列表推导式引用 try 内才赋值的 df(推导式独立作用域→df 成闭包 cell→cell 未赋值→NameError 逃逸到 broker 取价失败,兜底在自己最该兜的场反崩);修=try 前一行 df=None 预绑,get_price 抛异常时兜底走 df is not None=False→返 None 语义不变;TDD 先红后绿(本地精确复现同款 NameError),33 测全绿 [vps]
CI/CD / test (push) Successful in 32s
CI/CD / nas-deploy (push) Successful in 26s
CI/CD / nas-verify (push) Successful in 9s

This commit is contained in:
2026-09-14 09:30:13 +08:00
parent b2d12a4cf9
commit 1d0a54e6f4
2 changed files with 16 additions and 0 deletions
+1
View File
@@ -71,6 +71,7 @@ def build_price_getter(provider: Any) -> Any:
pass
end = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
start = (datetime.now() - timedelta(days=10)).strftime("%Y-%m-%d")
df = None # 预绑:get_price 抛异常时 except 兜底的推导式引用 df(闭包 cell)
try:
df = provider.get_price(
security=security, start_date=start, end_date=end,
@@ -55,3 +55,18 @@ class TestBuildPriceGetter:
p = SimpleNamespace(get_price=_StubProvider(close=22.35).get_price)
getter = build_price_getter(p)
assert getter("001234.XSHE") == 22.35
def test_daily_get_price_raising_returns_none(self):
"""日线 get_price 本身抛异常 → 返 None,兜底不得自崩成 NameError。
09-14 shadow_57 实锤(002646 连刷 356+):except 兜底里的列表推导式
引用 try 内才赋值的 df——推导式独立作用域使 df 成闭包 cell,get_price
抛异常时 cell 未赋值 → ``free variable 'df' referenced before
assignment in enclosing scope`` 逃逸到 broker 取价失败。
"""
def _raise_get_price(**_):
raise RuntimeError("rpc timeout")
getter = build_price_getter(SimpleNamespace(get_price=_raise_get_price))
assert getter("002646.XSHE") is None