Как сделать простой счетчик с шаблонами Jinja2?

У меня есть две петли for, обе одинаковые по достоинству. Я бы хотел, чтобы счетчик увеличивался во время каждой внутренней итерации.

Например, рассмотрим этот шаблон:

from jinja2 import Template

print Template("""
{% set count = 0 -%}
{% for i in 'a', 'b', 'c' -%}
  {% for j in 'x', 'y', 'z' -%}
    i={{i}}, j={{j}}, count={{count}}
    {% set count = count + 1 -%}
  {% endfor -%}
{% endfor -%}
""").render()

Не следует ли это печатать count = 0 - count = 8 ? Нет, это не так.

i=a, j=x, count=0
i=a, j=y, count=1
i=a, j=z, count=2
i=b, j=x, count=0
i=b, j=y, count=1
i=b, j=z, count=2
i=c, j=x, count=0
i=c, j=y, count=1
i=c, j=z, count=2

Что дает?

Примечание: Я не могу просто сохранить переменную внешнего цикла цикла для вычисления счетчика, потому что в моем программном обеспечении количество внутренних итераций является переменным.

13
задан Wooble 28 January 2011 в 14:07
поделиться

2 ответа

С переменными размерами внутренних групп это будет работать:

from jinja2 import Template

items = [
    ['foo', 'bar'],
    ['bax', 'quux', 'ketchup', 'mustard'],
    ['bacon', 'eggs'],
    ]

print Template("""
{% set counter = 0 -%}
{% for group in items -%}
  {% for item in group -%}
    item={{ item }}, count={{ counter + loop.index0 }}
  {% endfor -%}
  {% set counter = counter + group|length %}
{% endfor -%}
""").render(items=items)

... который напечатает:

item=foo, count=0
  item=bar, count=1

item=bax, count=2
  item=quux, count=3
  item=ketchup, count=4
  item=mustard, count=5

item=bacon, count=6
  item=eggs, count=7

Я полагаю, переменные, объявленные вне более чем одного уровня области видимости, не могут быть присвоены или что-то в этом роде.

15
ответ дан 1 December 2019 в 22:06
поделиться

Это действительно похоже на ошибку, но как насчет того, чтобы переместить часть этого вычисления за пределы шаблона?

from jinja2 import Template

outer_items = list(enumerate("a b c".split()))
inner_items = list(enumerate("x y z".split()))

print Template("""
{% for outer, i in outer_items -%}
  {% for inner, j in inner_items -%}
  {% set count = outer * num_outer + inner -%}
    i={{i}}, j={{j}}, count={{count}}
  {% endfor -%}
{% endfor -%}
""").render(outer_items=outer_items,
            inner_items=inner_items,
            num_outer=len(outer_items))

Вывод:

i=a, j=x, count=0
  i=a, j=y, count=1
  i=a, j=z, count=2
  i=b, j=x, count=3
  i=b, j=y, count=4
  i=b, j=z, count=5
  i=c, j=x, count=6
  i=c, j=y, count=7
  i=c, j=z, count=8
3
ответ дан 1 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: