2016-07-07 186 views
0

有辭典鍵過濾掉從字典

{% 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')) %} 

(在map.jinja定義)和一些函數定義接受的參數幾乎與字典的鍵(讓我們承擔的「功能」同樣實際上是一個宏)

{% 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 

快譯通,理解(而不是神社過濾器)也不起作用。

如何實現上述功能(過濾出鍵或至少用簡潔的方式用「提取」和過濾的字典調用函數)?

+0

似乎「some_macro」的定義是不隨你怎麼稱呼它是一致的。你可以粘貼你的支柱文件的內容來提供更多的細節嗎? –

+0

支柱是空的,不會覆蓋任何東西。我修復了錯字,謝謝! – lakier

+0

看來,rejectattr只能用於過濾列表,但'intellij'正在映射。如果你只是想過濾鍵,爲什麼不把宏定義爲'''some_macro(state_id,orig_name,download_url,archive_format,owner,archive_opts = None,owner_link_location = None)''' –

回答

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) }}