You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jinja2内层循环设置的Namespace变量外层取值为空问题排查

问题根因

你在内层循环的判断逻辑中重新实例化了Namespace对象覆盖了全局声明的vrf变量,而非修改原有全局Namespace的属性,导致修改仅在内层局部作用域生效:

  • 模板顶部声明的{% set vrf = namespace() %}是全局作用域的变量
  • 内层if host_item.vrf != ""分支中使用的{% set vrf = namespace(id=host_item.vrf) %}会在内层循环的局部作用域生成一个新的Namespace对象,同名局部vrf变量会覆盖全局的vrf变量,所有内层的赋值、打印操作都是针对这个局部变量生效,完全不会修改全局的vrf对象
  • 跳出内层循环后局部作用域销毁,访问到的仍是初始未修改的全局空vrf对象,因此会报属性不存在的错误

修复方案

全局仅初始化一次Namespace对象,后续跨作用域修改时直接修改其属性,不要重复给Namespace变量本身赋值,修改后的模板代码如下:

{% set found = namespace() %}
{% set vrf = namespace() %}
{% for group_item in site_master_list -%}
{%     for host_item in site.list -%}
{%         if group_item.ip_addr != host_item.ip_addr %}
none match {{ group_item.ip_addr }} none match {{ host_item.ip_addr }} 
{%            set found.tracker = false %}
does it have vrf {{ host_item.vrf }}
{%            if host_item.vrf != "" %}
{%                set vrf.id = host_item.vrf %}
vrf {{ vrf }}
vrf.id {{ vrf.id }}
{%            endif %}
{%         endif %}
{%     endfor %}
bottom vrf {{ vrf }}
{%- endfor %}

修改后内层赋值操作直接修改全局Namespace的id属性,跳出内层循环后外层依然可以正常读取属性值。

内容的提问来源于stack exchange,提问作者grichardson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 23:12:02