Jinja: Kartenfilter erlauben, mehrere Elemente abzurufen

Erstellt am 29. Feb. 2016  ·  4Kommentare  ·  Quelle: pallets/jinja

Momentan kann die Kartenfunktion nur so verwendet werden:

[{'path':'/var/file1', 'mtime': '123', 'mode': '600',...},{'path':'/var/file2', 'mtime': '123', 'mode': 644, ...}]|map(attribute='path')

mit der Rückkehr von

['/var/file1', '/var/file2']

(Dokumentation: http://jinja.pocoo.org/docs/dev/templates/#map)

Ich möchte vorschlagen, dies zuzulassen:

[{'path':'/var/file1', 'mtime': '123', 'mode': '600',...},{'path':'/var/file2', 'mtime': '123', 'mode': 644, ...}]|map(attribute=['path', 'mtime'])

oder

[{'path':'/var/file1', 'mtime': '123', 'mode': '600',...},{'path':'/var/file2', 'mtime': '123', 'mode': 644, ...}]|map(attributes=['path', 'mtime'])

was soll wiederkommen

[{'path':'/var/file1', 'mtime': '123'},{'path':'/var/file2', 'mtime': '123'}]

Sie können bereits sehen, wofür dies nützlich ist: eine Liste von Diktaten so zu manipulieren, dass diese Diktate nur einen begrenzten Satz von Attributen behalten.

Hilfreichster Kommentar

Wenn dies noch jemand benötigt, können Sie den folgenden Code verwenden (in playbooks/filter_plugins/mapattributes.py eingeben):

#!/usr/bin/env python
class FilterModule(object):
  def filters(self):
    return { 'mapattributes': self.mapattributes }

  def mapattributes(self, list_of_dicts, list_of_keys):
    l = []
    for di in list_of_dicts:
      newdi = { }
      for key in list_of_keys:
        newdi[key] = di[key]
      l.append(newdi)
    return l

Verwendung über:

ansible_mounts | mapattributes(['mount', 'size_total', 'size_available',])

Alle 4 Kommentare

Würde diese Funktion lieben.

Mir ist nicht klar, warum dies in Vorlagen benötigt wird. Wenn Sie nur die Wörterbücher durchlaufen und die benötigten Attribute verwenden, wird das gleiche erreicht. Wenn Sie andere Daten benötigen, ist es wahrscheinlich eine bessere Idee, diese Manipulation vor dem Rendern in Python vorzunehmen. Ich könnte _vielleicht_ eine Verwendung dafür sehen, Tupel zurückzugeben.

Wenn dies noch jemand benötigt, können Sie den folgenden Code verwenden (in playbooks/filter_plugins/mapattributes.py eingeben):

#!/usr/bin/env python
class FilterModule(object):
  def filters(self):
    return { 'mapattributes': self.mapattributes }

  def mapattributes(self, list_of_dicts, list_of_keys):
    l = []
    for di in list_of_dicts:
      newdi = { }
      for key in list_of_keys:
        newdi[key] = di[key]
      l.append(newdi)
    return l

Verwendung über:

ansible_mounts | mapattributes(['mount', 'size_total', 'size_available',])

Warum ist dieses Problem geschlossen und die Nee6ione-Lösung nicht offiziell implementiert? Es wäre so viel einfacher, wenn dies ohne zusätzliche Plugins unterstützt würde

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen