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

Ansible切换Python3后Jinja2中dict.items()[0]等效写法咨询

问题解决:Python3下Jinja2中dict.items()无法索引的问题

问题背景

将Ansible控制器从Python2切换到Python3后,原Jinja2模板中的表达式{{ osd['data_devices'].items()[0][0] }}失效,报错:

dict_items object has no element 0

原因是Python3中dict.items()返回的是视图对象而非列表,无法直接通过索引访问元素,而Python2中该方法返回的是列表,可直接索引。

解决方案

方法1:用括号包裹过滤器结果后索引

Jinja2中过滤器的优先级高于索引操作,需先通过list过滤器将items()的结果转为列表,再用括号包裹后进行索引:

{{ (osd['data_devices'].items() | list)[0][0] }}

此表达式可正确获取data_devices字典的第一个键(即paths)。

方法2:直接获取字典的第一个键(更简洁)

观察你的osd_spec结构,data_devices字典中仅包含paths一个键,因此可直接通过keys()结合first过滤器获取目标键,无需处理items():

{{ osd['data_devices'].keys() | first }}

该方式更直观,同时避免了列表转换的额外操作。

验证示例

针对你的osd_spec数据:

osd_spec:
   - spec_name: osd_spec1
     data_devices:
      paths:
      - /dev/sdg
      - /dev/sdh
   - spec_name: osd_spec2
     data_devices:
      paths:
      - /dev/sda
      - /dev/sdb

两种方法均会输出paths,符合预期需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:45:42