Jinja: Разрешить фильтру карты получать несколько элементов

Созданный на 29 февр. 2016  ·  4Комментарии  ·  Источник: pallets/jinja

На данный момент функцию карты можно использовать только так:

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

с возвращением

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

(Документы: http://jinja.pocoo.org/docs/dev/templates/#map)

Я хочу предложить разрешить это:

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

или

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

который должен вернуться

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

Вы уже можете видеть, для чего это полезно: манипулировать списком словарей, чтобы в этих словах сохранялся только ограниченный набор атрибутов.

Самый полезный комментарий

Если кому-то это все еще нужно, вы можете использовать следующий код (введите 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

Использовать через:

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

Все 4 Комментарий

ПОНРАВИТСЯ эту функцию.

Я не понимаю, зачем это нужно в шаблонах. Просто перебирая словари и используя нужные атрибуты, вы добьетесь того же результата. Если вам нужны другие данные, вероятно, лучше провести эту манипуляцию в Python перед рендерингом. Я мог _maybe_ увидеть, как он возвращает кортежи.

Если кому-то это все еще нужно, вы можете использовать следующий код (введите 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

Использовать через:

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

Почему этот вопрос закрыт, а решение Nee6ione официально не реализовано? Было бы намного проще, если бы это поддерживалось без каких-либо дополнительных плагинов.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги