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))]