Jinja: Permitir que el filtro de mapa recupere varios elementos

Creado en 29 feb. 2016  ·  4Comentarios  ·  Fuente: pallets/jinja

Por el momento, la función de mapa solo se puede usar así:

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

con el regreso de

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

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

Quiero proponer permitir esto:

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

o

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

que debería volver

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

Ya puede ver para qué es útil: manipular una lista de dictados para que estos dictados solo retengan un conjunto limitado de atributos.

Comentario más útil

Si alguien aún necesita esto, puede usar el siguiente código (ingrese playbooks/filter_plugins/mapattributes.py ):

#!/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

Usar a través de:

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

Todos 4 comentarios

Me ENCANTARÍA esta característica.

No tengo claro por qué se necesita esto en las plantillas. Simplemente iterando sobre los diccionarios y usando los atributos que necesita, logrará lo mismo. Si necesita datos diferentes, probablemente sea una mejor idea hacer esa manipulación en Python antes de renderizar. Podría _tal vez_ ver un uso para devolver tuplas.

Si alguien aún necesita esto, puede usar el siguiente código (ingrese playbooks/filter_plugins/mapattributes.py ):

#!/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

Usar a través de:

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

¿Por qué este problema está cerrado y la solución Nee6ione no se implementó oficialmente? Sería mucho más simple si esto fuera compatible sin complementos adicionales

¿Fue útil esta página
0 / 5 - 0 calificaciones