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
相关产品推荐
相关产品推荐

