what python3 get_template async python code-generation jinja2

python3 - macros jinja2



zip(list1, list2) en Jinja2? (3)

Como no mencionó si está utilizando Flask o no, pensé que agregaría mis conclusiones.

Para ser usado por render_template() cree el filtro ''zip'' usando la función zip() en el entorno Jinja2 usado por Flask.

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

Para usar esto dentro de una plantilla hazlo así:

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

Ten en cuenta que las cuerdas son iterables Jinja2, así que si intentas comprimirlas obtendrás algunas cosas locas. Para asegurarse de que lo que quiere comprimir es iterable y no una cadena haga esto:

{% 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 %}

Estoy haciendo la generación de código en Jinja2 y con frecuencia quiero recorrer dos listas juntas (es decir, tipos y nombres de variables), ¿hay alguna forma sencilla de hacerlo o simplemente debo pasar una lista pre-comprimida? No pude encontrar tal función en los docs o en google.


Modifique el propio espacio de nombres global de jinja2.Environment si lo considera adecuado.

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

Esto puede ser útil para separar la lógica de vista (plantilla) de la lógica de la aplicación, pero también habilita lo contrario. # separationofconcerns


No creo que los lenguajes de plantillas permitan hacer zip de dos contenedores sobre el bucle. Aquí hay una pregunta similar para las plantillas django y jinja es muy similar a la de django.

Tendría que crear previamente un contenedor comprimido y pasarlo a su plantilla.

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

Es equivalente a

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