while true terminar for ejemplos como ciclo bucle python jinja2

python - true - Jinja2: cambia el valor de una variable dentro de un bucle



while en python 3 (3)

Podrías hacer esto para limpiar el código de la plantilla.

{% for item in items %} {{ set_foo_is_true(local_vars) }} {% if local_vars.foo %} Ok(1)! {% endif %} {% endfor %} {% if local_vars.foo %} Ok(2)! {% endif %}

Y en el uso del código del servidor.

items = [''item1'', ''item2'', ''item3''] #--------------------------------------------- local_vars = { ''foo'': False } def set_foo_is_true(local_vars): local_vars[''foo''] = True return '''' env.globals[''set_foo_is_true''] = set_foo_is_true #--------------------------------------------- return env.get_template(''template.html'').render(items=items, local_vars=local_vars)

Esto podría generalizarse a los siguientes

{{ set_local_var(local_vars, "foo", False) }} {% for item in items %} {{ set_local_var(local_vars, "foo", True) }} {% if local_vars.foo %} Ok(1)! {% endif %} {% endfor %} {% if local_vars.foo %} Ok(2)! {% endif %}

Y en el uso del código del servidor.

items = [''item1'', ''item2'', ''item3''] #--------------------------------------------- local_vars = { ''foo'': False } def set_local_var(local_vars, name, value): local_vars[name] = value return '''' env.globals[''set_local_var''] = set_local_var #--------------------------------------------- return env.get_template(''template.html'').render(items=items, local_vars=local_vars)

Quiero cambiar el valor de la variable declarada fuera del bucle dentro de un bucle. Pero siempre cambiando, mantiene el valor inicial fuera del bucle.

{% set foo = False %} {% for item in items %} {% set foo = True %} {% if foo %} Ok(1)! {% endif %} {% endfor %} {% if foo %} Ok(2)! {% endif %}

Esto hace que:

Ok(1)!

Así que la única solución (mala) que hemos encontrado hasta ahora fue esta:

{% set foo = [] %} {% for item in items %} {% if foo.append(True) %} {% endif %} {% if foo %} Ok(1)! {% endif %} {% endfor %} {% if foo %} Ok(2)! {% endif %}

Esto hace que:

Ok(1)! Ok(2)!

Pero, es muy feo! ¿Hay otra solución más elegante?


Pruebe también el enfoque basado en el diccionario. Parece ser menos feo.

{% set vars = {''foo'': False} %} {% for item in items %} {% if vars.update({''foo'': True}) %} {% endif %} {% if vars.foo %} Ok(1)! {% endif %} {% endfor %} {% if vars.foo %} Ok(2)! {% endif %}

Esto también hace que:

Ok(1)! Ok(2)!


como se menciona en la documentación:

Tenga en cuenta que las asignaciones en bucles se borrarán al final de la iteración y no pueden superar el alcance del bucle.

pero a partir de la versión 2.10 puede usar espacios de nombres:

{% set ns = namespace(foo=false) %} {% for item in items %} {% set ns.foo = True %} {% if ns.foo %} Ok(1)! {% endif %} {% endfor %} {% if ns.foo %} Ok(2)! {% endif %}