python - Mako 模板中重复使用的变量导致 "UnboundLocalError: local variable ' xyz' 在赋值之前被引用”

标签 python mako

我有这个“有趣”的问题。我知道在很多地方都可以找到此错误消息,但我找不到与 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/

相关文章:

python - 为什么 python 的 eval 有长度限制?

python - catboost 分类器可以解决类别不平衡问题吗?

Python+mako Unicode问题

python - 如何从 Python 创建 Revit 加载项 DLL

python - 两条不相交线之间的角度

python - 怎么才能看到请求数据呢?

python - Mako 动态模板继承

javascript - Pyramid 无法访问静态 Assets (既不是 .jpg 图像也不是 .js 文件)

python - 如何在 Python 的 Mako 模板中迭代时跟踪状态

python - 从文件加载 mako 模板