[Jinja2] Solution au problème que les variables ajoutées dans l'instruction for ne sont pas héritées

introduction

Python: 3.7.4 jinja2: 2.7.2

Supposons que vous ayez le code suivant et que vous ajoutiez une variable appelée cnt dans l'instruction for.

count_test.j2


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

Résultat de l'exécution (exemple d'échec)

En regardant le résultat, vous pouvez voir que le résultat ajouté à la variable n'est pas hérité en dehors de l'instruction for.

production


2
3
4
result : 1

Selon la version, il semble qu'il ne soit pas ajouté.

production


2
2
2
result : 1

Solution 1: stocker dans la liste

Cela fonctionne bien si vous stockez le résultat ajouté dans une liste. Ajoutez la valeur ajoutée à la liste avec append et supprimez la valeur avant l'ajout avec 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] }}

Solution 2: utiliser l'espace de noms

<21/12/2019: De na90ya> Il semble que les variables soient préservées lors de l'utilisation d'objets d'espace de noms introduits dans la version 2.10 de jinja2. (Matériel de référence [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 }}

Résultat de l'exécution (exemple de réussite)

En regardant le résultat, les variables sont toujours ajoutées en dehors de l'instruction for.

production


2
3
4
result : 4

Matériel de référence

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

Recommended Posts

[Jinja2] Solution au problème que les variables ajoutées dans l'instruction for ne sont pas héritées
Une solution au problème que les fichiers contenant [et] ne sont pas répertoriés dans glob.glob ()
Solution au problème que Ctrl + z ne peut pas être utilisé dans Powershell dans l'environnement Docker pour Windows (provisoire)
Solution au problème qui ne se termine pas lors de l'installation d'OpenCV (PEP517)
Solution au problème que vous ne pouvez pas activer en mettant conda dans pyenv
[Python] Solution au problème que les éléments sont liés lors de la copie d'une liste
Comment définir plusieurs variables dans une instruction Python for
Essayez d'extraire les mots-clés populaires dans COTOHA
Comment écrire des conseils de type pour les variables qui sont affectées plusieurs fois sur une ligne
Comment activer l'instruction for lorsqu'il existe plusieurs valeurs pour une clé dans le dictionnaire
[VLC] Comment gérer le problème de ne pas être au premier plan pendant la lecture
Solution au problème que l'affichage est corrompu lorsque la commande .exe est incluse dans la boucle while dans wsl2
Téléchargez et gérez les packages qui ne sont pas dans conda sur anaconda.org
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Résout le problème que les fichiers statiques (CSS, JS, img) ne sont pas lus lorsque DEBUG = False dans Django.
La somme de contrôle NVM n'est pas valide, une solution au problème que le LAN câblé d'Intel ne reconnaît pas sous Linux.
Changer la liste dans l'instruction for
Je pensais qu'il serait lent d'utiliser l'instruction for dans NumPy, mais ce n'était pas le cas.
Comment trouver la corrélation pour les variables catégorielles
Notez que j'étais accro au script npm ne passant pas dans l'environnement de vérification
À propos du fait que le contenu de l'impression Python n'est pas visible dans les journaux du docker
[systemd] Comment faire face au problème que fancontrol ne fonctionne pas après la suspension
Résolvez le problème que CSS n'est pas reflété lors du développement d'applications Web avec Flask
Résolution du problème selon lequel l'image n'était pas affichée dans ROMol lors du chargement avec PandasTools.LoadSDF.
Comment exécuter le module Ansible ajouté dans Ansible Tower
Entrée clé qui n'attend pas l'entrée clé en Python
Pratique pour utiliser les sous-graphiques matplotlib dans l'instruction for
Lorsque vous voulez plt.save dans l'instruction for
Ne passez pas self à ProcessPoolExecutor en classe
L'histoire selon laquelle yapf n'a pas fonctionné avec vscode
Est-ce un problème d'éliminer le besoin de ressources humaines analogiques à l'ère de l'IA?
Comment résoudre le problème que le contenu vidéo ne peut pas être lu sur Firefox pour Linux
Comment définir des variables pouvant être utilisées dans toute l'application Django ~ Utile pour les modèles, etc. ~
Solution de contournement pour sys.argv non transmise lors de l'exécution d'un script Python avec uniquement le nom de fichier sur Python2.7 sous Windows