[PYTHON] [Jinja2] Lösung für das Problem, dass die in der for-Anweisung hinzugefügten Variablen nicht vererbt werden

Einführung

Python: 3.7.4 jinja2: 2.7.2

Angenommen, Sie haben den folgenden Code und fügen der for-Anweisung eine Variable namens cnt hinzu.

count_test.j2


{%- set cnt = 1 -%}
{%- for i in range(3) -%}
{%- set cnt = cnt + 1 -%}
{{ cnt }}
{% endfor -%}
result : {{ cnt }}

Ausführungsergebnis (Fehlerbeispiel)

Wenn Sie sich das Ergebnis ansehen, sehen Sie, dass das der Variablen hinzugefügte Ergebnis nicht außerhalb der for-Anweisung vererbt wird.

Ausgabe


2
3
4
result : 1

Abhängig von der Version scheint es, dass es nicht hinzugefügt werden kann.

Ausgabe


2
2
2
result : 1

Lösung 1: In Liste speichern

Es funktioniert gut, wenn Sie das hinzugefügte Ergebnis in einer Liste speichern. Fügen Sie den Mehrwert mit Anhängen zur Liste hinzu und löschen Sie den Wert vor dem Hinzufügen mit Pop.

count_test2.j2


{%- set cnt = [1] -%}
{%- for i in range(3) -%}
{%- set _ = cnt.append(cnt[0] + 1) -%}
{%- set _ = cnt.pop(0) -%}
{{ cnt[0] }}
{% endfor -%}
result : {{ cnt[0] }}

Lösung 2: Verwenden Sie den Namespace

<2019/12/21: Von na90ya> Es scheint, dass Variablen erhalten bleiben, wenn Namespace-Objekte verwendet werden, die in 2.10 von jinja2 eingeführt wurden. (Referenzmaterial [1])

count_test3.j2


{%- set ns = namespace(cnt=1) -%}
{%- for i in range(3) -%}
{%- set ns.cnt = ns.cnt + 1 -%}
{{ ns.cnt }}
{% endfor -%}
result : {{ ns.cnt }}

Ausführungsergebnis (Erfolgsbeispiel)

Wenn Sie das Ergebnis betrachten, werden die Variablen immer noch außerhalb der for-Anweisung hinzugefügt.

Ausgabe


2
3
4
result : 4

Referenzmaterial

[[1]Template Designer Documentation] (https://jinja.palletsprojects.com/en/2.10.x/templates/#assignments)

Recommended Posts

[Jinja2] Lösung für das Problem, dass die in der for-Anweisung hinzugefügten Variablen nicht vererbt werden
Eine Lösung für das Problem, dass Dateien mit [und] nicht in glob.glob () aufgeführt sind
Lösung für das Problem, dass Strg + z in Powershell in Docker für Windows nicht verwendet werden kann (vorläufig)
Lösung für das Problem, dass der Build bei der Installation von OpenCV (PEP517) nicht beendet wird
Lösung für das Problem, das Sie nicht aktivieren können, indem Sie conda in pyenv setzen
[Python] Lösung für das Problem, dass Elemente beim Kopieren einer Liste verknüpft werden
So definieren Sie mehrere Variablen in einer Python for-Anweisung
Versuchen Sie, die in COTOHA beliebten Schlüsselwörter zu extrahieren
So schreiben Sie Typhinweise für Variablen, die mehrfach in einer Zeile zugewiesen werden
So drehen Sie die for-Anweisung, wenn das Wörterbuch mehrere Werte für einen Schlüssel enthält
[VLC] Wie man mit dem Problem umgeht, dass es während der Wiedergabe nicht im Vordergrund steht
Lösung für das Problem, dass die Anzeige beschädigt ist, wenn der Befehl .exe in der while-Schleife in wsl2 enthalten ist
Laden Sie Pakete, die sich nicht in Conda befinden, auf anaconda.org hoch und verwalten Sie sie
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
Behebt ein Problem, bei dem statische Dateien (CSS, JS, img) nicht geladen werden, wenn DEBUG = False in Django ist.
Die NVM-Prüfsumme ist ungültig, eine Lösung für das Problem, das das kabelgebundene LAN von Intel unter Linux nicht erkennt.
Ändern Sie die Liste in der for-Anweisung
Ich dachte, es wäre langsam, die for-Anweisung in NumPy zu verwenden, aber das war nicht der Fall.
So finden Sie die Korrelation für kategoriale Variablen
Beachten Sie, dass ich süchtig nach dem npm-Skript war, das in der Überprüfungsumgebung nicht übergeben wurde
Zu dem Problem, dass der Inhalt von Python print in Docker-Protokollen nicht sichtbar ist
[systemd] Wie gehe ich mit dem Problem um, dass fancontrol nach dem Anhalten nicht funktioniert?
Lösen Sie das Problem, dass CSS bei der Entwicklung von Webanwendungen mit Flask nicht berücksichtigt wird
Das Problem, dass das Bild beim Laden mit PandasTools.LoadSDF nicht in ROMol angezeigt wurde, wurde behoben.
Ausführen des in Ansible Tower hinzugefügten Ansible-Moduls
Schlüsseleingabe, die nicht auf Schlüsseleingabe in Python wartet
Praktisch, um Matplotlib-Unterzeichnungen in for-Anweisungen zu verwenden
Wenn Sie in der for-Anweisung plt.save möchten
Übergeben Sie sich in der Klasse nicht an ProcessPoolExecutor
Die Geschichte, dass yapf nicht mit vscode funktioniert hat
Ist es ein Problem, den Bedarf an analogen Humanressourcen in der KI-Ära zu beseitigen?
So lösen Sie das Problem, dass Videoinhalte unter Firefox für Linux nicht abgespielt werden können
So legen Sie Variablen fest, die in der gesamten Django-App verwendet werden können ~ Praktisch für Vorlagen usw. ~
Problemumgehung für sys.argv wird nicht übergeben, wenn ein Python-Skript mit nur dem Dateinamen unter Python2.7 unter Windows ausgeführt wird