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折叠块标记<代码>-是块的咀嚼指示器(末尾没有新行)。有关更多说明和信息,请参阅