Python 如何使用Jinja2将静态项附加到dict
如果我有以下清单:Python 如何使用Jinja2将静态项附加到dict,python,python-3.x,ansible,jinja2,Python,Python 3.x,Ansible,Jinja2,如果我有以下清单: [ { "a": "1", "b": "2" }, { "a": "3", "b": "4" }, { "a": "5", "b": "6" } ] 如何使用Jijja2过滤器重命名第一个列表的键并将静态项附加到每个dict 例如: [ { "a2": "1", "b2
[
{
"a": "1",
"b": "2"
},
{
"a": "3",
"b": "4"
},
{
"a": "5",
"b": "6"
}
]
如何使用Jijja2过滤器重命名第一个列表的键并将静态项附加到每个dict
例如:
[
{
"a2": "1",
"b2": "2",
"c2": "test"
},
{
"a2": "3",
"b2": "4",
"c2": "test"
},
{
"a2": "5",
"b2": "6"
"c2": "test"
}
]
我尝试了以下方法:
{{ my_list | map('json_query', '{a2:a, b2:b}') | list }}
这是成功的一半,但我如何将静态项附加到生成的dict中?以下操作应该可以:
- debug:
msg: >-
{{ my_list | json_query("[].{a2: a, b2: b, c2: 'test' }") }}
通过数据的复制粘贴得到以下结果:
"msg": [
{
"a2": "1",
"b2": "2",
"c2": "test"
},
{
"a2": "3",
"b2": "4",
"c2": "test"
},
{
"a2": "5",
"b2": "6",
"c2": "test"
}
]
}
单引号和双引号嵌套的顺序很重要(请参阅)。如果将单引号/双引号放在另一个位置,则静态字符串的结果将是“无”我将定义一个全局python函数来负责修改字典。它看起来像:
def some_func(my_sequence):
new_sequence = []
for my_dict in my_sequence:
new_dict = {f"{key}2": value for key, value in my_dict.items()}
new_dict.update(c2="test")
new_sequence.append(new_dict)
return new_sequence
当然可以改进以删除硬编码
一旦定义了Jinja2环境,我将声明一个指向该函数的自定义过滤器
environment.filters["my_customfilter"] = some_func
并将其用于模板中,如下所示:
{{ my_list|my_customfilter() }}
或进入一个循环:
{% for my_dict in my_list|my_customfilter() %}
{# do something here #}
{% endfor %}
或任何其他用途
这样,主逻辑不是由Jinja2带来的,它只是一个模板引擎,而是由主python脚本带来的。在进化的情况下,您的代码更加灵活。这似乎可行!我假设
>-
用于告诉Ansible值是一个字符串,而不必使用实际的引号,这是嵌套所必需的?有没有办法逃避任何事情来弥补这一点?(理想情况下,所有东西都可以放在一条线上)看起来你可以<代码>“{my_list}json_query(\“[.{a2:a,b2:b,c2:'test'}\”)}}”似乎可以工作!很抱歉迟了答复<代码>>是yaml折叠块标记<代码>-是块的咀嚼指示器(末尾没有新行)。有关更多说明和信息,请参阅