Jinja: Izinkan filter peta untuk mengambil beberapa item

Dibuat pada 29 Feb 2016  ·  4Komentar  ·  Sumber: pallets/jinja

Saat ini, fungsi peta hanya dapat digunakan seperti ini:

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

dengan kembalinya

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

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

Saya ingin mengusulkan mengizinkan ini:

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

atau

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

yang harus kembali

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

Anda sudah dapat melihat apa kegunaannya: memanipulasi daftar dict sehingga dict ini hanya mempertahankan sekumpulan atribut yang terbatas.

Komentar yang paling membantu

Jika ada yang masih membutuhkan ini, Anda dapat menggunakan kode berikut (masukkan 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

Gunakan melalui:

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

Semua 4 komentar

Akan MENYUKAI fitur ini.

Saya tidak jelas mengapa ini diperlukan dalam templat. Hanya mengulangi kamus dan menggunakan atribut yang Anda butuhkan akan mencapai hal yang sama. Jika Anda membutuhkan data yang berbeda, mungkin ide yang lebih baik untuk melakukan manipulasi itu dengan Python sebelum melakukan rendering. Saya bisa _mungkin_ melihat kegunaannya mengembalikan tupel.

Jika ada yang masih membutuhkan ini, Anda dapat menggunakan kode berikut (masukkan 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

Gunakan melalui:

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

Mengapa masalah ini ditutup dan solusi Nee6ione tidak diimplementasikan secara resmi? Akan jauh lebih sederhana jika ini didukung tanpa plugin tambahan

Apakah halaman ini membantu?
0 / 5 - 0 peringkat