我有这个“有趣”的问题。我知道在很多地方都可以找到此错误消息,但我找不到与 Mako 明确相关的错误消息。
在 Mako 模板中,我有(片段):
<%inherit file="other.mako"/>
<%def name="my_method()">Search for ${label}</%def>
[...]
<h2>${label.capitalize()} found: ${len(l)}</h2>
...
<ol>
% for (label, field_name) in some_list:
<li>${label}: ${field_name}</li>
% endfor
</ol>
我会得到错误:
UnboundLocalError: local variable 'label' referenced before assignment
奇怪的是,如果我不使用第二个 ${label.capitalize()}
,我没有收到任何错误,并且 ${label}
的值在 <%def>
是我想要的,而不是 for 循环中的。如果我对 <%def>
中的变量有同样的错误,很明显不重用相同的变量名,但在这种情况下,我对发生这种事情感到非常困惑。
除了在 for 循环中重命名变量 label 之外,谁能告诉我如何避免这种情况?如果我重命名 for 循环变量名称,问题就会消失。我正在从另一个没有此类错误的模板系统转移,因此类似的情况经常发生。
感谢您的指点,
D.
编辑清楚:
我使用以下方式调用我的模板:
renderers.render_to_response(my_mako_tmpl,
{'label': 'value', 'somelist':[a,b,c], 'l':[]},
request=request)
我的问题是:为什么我有 % for (label, field_name)
-循环,变量label
给我错误 ${label.capitalize()}
,因为它不会给我任何 Search for ${label}
的错误.
如果我将 for 循环更改为:
% for (label_name, field_name) in some_list:
我没有收到任何错误。
如果我不改变 for 循环,但我改变了:
<h2>${label.capitalize()} found: ${len(l)}</h2>
至
<h2>Items found: ${len(l)}</h2>
即使 ${label}
我也没有收到错误用于我的 <%def>
.
此外,为了添加模板使用信息,我添加了 <%inherit>
这是 other.mako
的方法定义(片段):
<%def name="my_method()">Default value</%def>
Value of my_method() = ${self.my_method()}
所以我不需要将任何值传递给 my_method()
.
希望这能让问题更清楚。
最佳答案
最好将 Mako 模板视为类似于一段 Python 代码。因此,就像在 python 中一样,如果您希望变量同时具有本地作用域和全局(或嵌套作用域),则会遇到问题。
将模板视为一个接受变量的函数,并在其中定义各种其他函数,包括 body()
函数,那么您的问题实际上类似于以下内容
>>> def f(x):
... def body():
... print x
... for x in range(5):
... print x
... body()
...
>>> f(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in f
File "<stdin>", line 3, in body
UnboundLocalError: local variable 'x' referenced before assignment
您不应该期望它在 Python 中工作,同样,您也不应该期望它在 Mako 模板中工作。
关于python - Mako 模板中重复使用的变量导致 "UnboundLocalError: local variable ' xyz' 在赋值之前被引用”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9272097/