zip (list1, list2) в Jinja2? - PullRequest
       30

zip (list1, list2) в Jinja2?

30 голосов
/ 06 марта 2011

Я делаю генерацию кода в Jinja2 и часто хочу перебирать два списка вместе (т.е. имена и типы переменных), есть ли простой способ сделать это или мне нужно просто пропустить предварительно упакованный список?Мне не удалось найти такую ​​функцию в документах или поиске в Google.

Ответы [ 3 ]

37 голосов
/ 07 марта 2011

Измените собственное глобальное пространство имен jinja2.Environment , если считаете нужным.

import jinja2
env = jinja2.Environment()
env.globals.update(zip=zip)
# use env to load template(s)

Это может быть полезно при отделении логики представления (шаблона) от логики приложения, но включаети наоборот.# separationofconcerns

6 голосов
/ 29 сентября 2017

Поскольку вы не упомянули, используете ли вы Flask или нет, я решил добавить свои выводы.

Для использования render_template() создайте фильтр 'zip', используя функцию zip() в среде Jinja2, используемой Flask.

app = Flask(__name__)
...
app.jinja_env.filters['zip'] = zip

Чтобы использовать это в шаблоне, сделайте это так:

{% for value1, value2 in iterable1|zip(iterable2) %}
    {{ value1 }} is paired with {{ value2 }}
{% endfor %}

Имейте в виду, что Jinja2 - это итеративные строки, поэтому, если вы попытаетесь сжать строки, вы получите некоторые сумасшедшие вещи. Чтобы убедиться, что вы хотите, чтобы zip был повторяемым, а не строка, сделайте следующее:

{%  if iterable1 is iterable and iterable1 is not string 
   and iterable2 is iterable and iterable2 is not string %}
    {% for value1, value2 in iterable1|zip(iterable2) %}
        {{ value1 }} is paired with {{ value2 }}
    {% endfor %}
{% else %}
  {{ iterable1 }} is paired with {{ iterable2 }}
{% endif %}
3 голосов
/ 06 марта 2011

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

Вы должны предварительно собрать zip-контейнер и перейти к своему шаблону.

>> for i,j in zip(range(10),range(20,30)):
...     print i,j
... 

эквивалентно

>>> [(i,j) for i,j in zip(range(10),range(20,30))]
...