Я думаю, вам нужно включить метку в аргументы my_method.
<%def name="my_method(label)">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>
Последующий
Насколько я могу судить, вам придется изменить имя переменной цикла. Это может быть нюанс пространств имен Mako или Python, которые я не совсем понимаю, но это, кажется, самый безопасный вариант. По моему мнению, повторное использование имен переменных, таких как это, в любом случае является плохой формой и ведет к непредвиденному поведению, подвержено ошибкам и т. Д.
Из моей оценки видно, что это может быть особенностью мако в том, как он обрабатывает пространства имен. Рассмотрим следующие примеры. Первый вызывает то же исключение UnboundLocalError. Второй идентичен по структуре и не вызывает исключений.
Пример 1 вызывает UnboundLocalError:
from mako.template import Template
src = """
Text in "label": ${label}
Elements of "some_list": ${some_list}
Labels and names in "some_list"
% for (label,name) in some_list:
label: name -> ${label}: ${name}
% endfor
${label.capitalize()}
"""
my_template = Template(src)
s = [('foo', 'bar'), ('spam', 'eggs')]
data = {'label': 'bogus', 'some_list':s, 'l':[1, 2, 3, 4]}
print(my_template.render(**data))
Выходы:
Traceback (most recent call last):
...
File "C:\Python26\ArcGIS10.0\Lib\site-packages\mako-0.6.2-py2.6.egg\mako\runtime.py", line 704, in _exec_template
callable_(context, *args, **kwargs)
File "memory:0xb5b6b0", line 22, in render_body
UnboundLocalError: local variable 'label' referenced before assignment
Пример 2 оценивается успешно:
from mako.template import Template
src = """
Text in "label": ${label}
Elements of "some_list": ${some_list}
Labels and names in "some_list"
% for (loop_label,name) in some_list:
label: name -> ${loop_label}: ${name}
% endfor
${label.capitalize()}
"""
my_template = Template(src)
s = [('foo', 'bar'), ('spam', 'eggs')]
data = {'label': 'bogus', 'some_list':s, 'l':[1, 2, 3, 4]}
print(my_template.render(**data))
Выход:
Text in "label": eggs
Elements of "some_list": [('foo', 'bar'), ('spam', 'eggs')]
Labels and names in "some_list"
label: name -> foo: bar
label: name -> spam: eggs
Eggs
Чтобы продемонстрировать, что Мако оценивает шаблон не так, как вы могли бы ожидать, вот пример аналогично структурированного чистого Python, который оценивается просто отлично.
src = """
print('Text in "label": %s' % label)
print('Elements of "some_list": %s' % some_list)
print('')
print('Labels and names in "some_list"')
for (label,name) in some_list:
print(' label: name -> %s:%s' % (label, name))
print('')
print('Caps "label": %s' % label.capitalize())
"""
code = compile(src, 'None', 'exec')
s = [('foo', 'bar'), ('spam', 'eggs')]
data = {'label': 'bogus', 'some_list':s, 'l':[1, 2, 3, 4]}
eval(code, {}, data)
Выходы:
Text in "label": bogus
Elements of "some_list": [('foo', 'bar'), ('spam', 'eggs')]
Labels and names in "some_list"
label: name -> foo:bar
label: name -> spam:eggs
Caps "label": Spam