先把当时的情况摆出来。guidance 0.2.0 写了一个批量模板,外层 capture 了 name,循环里又用 {{gen 'name'}} 生成子项,渲染时报 name already exists in namespace,换模板文件名也不管用。

原因不止一个,得分开看。gen 的变量名与外层 capture 重名,命名空间拒绝覆盖。另一种情况是geneach 循环里没有用 item 变量区分每一轮。

还有一种情况,该版本把 hidden 变量的作用域收紧了,旧写法失效。另外,模板被 include 了两次,同名变量被注册两遍。

先用最小模板复现,确认是命名冲突

python -c "import guidance;print(guidance.__version__)"

随后把生成的变量改名成 item_name

python -c "print({{gen 'item_name'}})"

循环里用 geneach 的 this 引用当前元素

python -c "print({{#geneach 'items' num_iterations=3}}{{gen 'item_name'}}{{/geneach}})"

渲染后按行解析,确认每个子项都有值

python -c "print(open('out.txt').read().splitlines())"

我习惯把每一步的执行时间和结果记在一边,后面复盘省事。

别只看报错消失,验证要多做一步。模板一次渲染出三行子项,变量互不覆盖,重复执行结果稳定,命名空间不再报冲突。

0.2 之后变量作用域比旧版严格,同名 capture 和 gen 会直接撞车,命名时带上层级前缀是最省心的办法。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189