从字典中过滤掉密钥

时间:2016-07-07 21:18:27

标签: python jinja2 salt-stack

有字典(在 map.jinja 中定义)

{% set intellij = salt['grains.filter_by']({
    'default': {
        'orig_name': 'idea-IC-145.1617.8',
        'download_url': 'www.example.com',         
        'archive_format': 'tar',
        'archive_opts': 'xfz',
        'owner': 'root',
        'owner_link_location': '/blabla/bin/idea',
    },
}, merge=salt['pillar.get']('intellij')) %}

和一些函数定义接受的参数几乎与字典的键相同(让我们假设"函数"实际上是一个宏)

{% macro some_macro(state_id, orig_name, download_url, archive_format, owner, archive_opts=None) %}

我想过滤掉一些键,以便我可以像这样调用它:

{{ some_macro('some_state', **intellij) }}

我尝试了各种结构,例如:

{{ some_macro('intellij', **(intellij|rejectattr("owner_link_location"))) }}

产生

Jinja error: call() argument after ** must be a mapping, not generator

Dict-comprehension(而不是jinja过滤器)也不起作用。

如何实现上述功能(过滤掉键或至少使用&#34调用函数;提取"以简洁的方式过滤字典)?

1 个答案:

答案 0 :(得分:0)

您遇到的问题描述为here 有一个解决方法,对我来说很好。

{% macro some_macro(state_id, orig_name, download_url, archive_format, owner, archive_opts=None) -%}
{% if kwargs | length >= 0 -%}
// implement your macro definition here
{% endif -%}
{% endmacro -%}

关键是如果您没有使用映射中的所有变量,则必须调用kwargs

然后将您的宏称为:

{{ some_macro('some_state', **intellij) }}