【问题标题】:Iterate through a multilevel yaml map using a jinja2 template使用 jinja2 模板遍历多级 yaml 映射
【发布时间】:2019-08-16 15:13:28
【问题描述】:

目前,我正在尝试通过遍历所有键来访问位于不同地图“级别”中的 YAML 键。循环遍历前两个“级别”是可行的,但不会比这更深。代码仍然运行。它只是没有进入下一个循环。

我尝试了不同的 for 循环变体:

yaml:

---
root:
- key1: bla
  key2: bla
  sub:
    key3: bla
    key4: bla
    map: {key5: bla, key6: bla, key7: bla} 
    sub:
    - key8
.
.
. 

jinja2 模板:

{% for l0 in root %}
test0
  {% for l1 in l0.sub %}
  test1
    {% for l2 in l1.sub %}
    test2
      {% for l3 in l2.sub %}
      test3
      {% endfor %}
    {% endfor %}
  {% endfor %}
{% endfor %}

感谢您的帮助!

【问题讨论】:

  • 我不相信您在此处提供的示例数据和代码实际上证明了您所描述的问题。请更新您的问题,以便示例数据在与包含的模板一起使用时重现错误。

标签: python yaml jinja2


【解决方案1】:

root 包含一个序列。所以你的最外层循环遍历root 中的序列项,这很好。

第二个循环从当前项中查询sub 的值。 sub 不包含序列,而是映射。映射被加载到 Python dict 对象中。在 Python 中,for 在 dict 对象上循环遍历键。因此,l1 在迭代期间将包含以下字符串值:

"key3"
"key4"
"map"
"sub"

由于这些都是字符串,l1.sub 不存在,因此永远不会执行第三个循环。

现在,要解决此问题,您需要考虑数据的含义。奇怪的是,第 9 行的嵌套 sub 确实再次包含一个序列,而第 5 行的初始 sub 却没有。也许您的问题出在数据中,而外部 sub 实际上应该包含一个序列?

对以下数据执行模板将使用内部循环:

---
root:
- key1: bla
  key2: bla
  sub:
  - key3: bla  # note the additional `-` here
    key4: bla
    map: {key5: bla, key6: bla, key7: bla} 
    sub:
    - key8
      sub:    # added to reach the innermost loop
      - key9
...

如果数据正确,您应该考虑是真的要执行l1 循环还是要执行此操作:

{% for l1 in l0.sub.sub %}

这直接下降到内部sub,实际上是一个序列。

【讨论】:

  • 哇,谢谢!这确实帮助我更好地理解了 YAML 语法。
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多