Jinja: filter bool ke string tidak berfungsi

Dibuat pada 6 Agu 2018  ·  14Komentar  ·  Sumber: pallets/jinja

Perilaku yang Diharapkan

Memfilter bool ke string akan menghasilkan True atau False masing-masing nilainya.

Perilaku Sebenarnya

Memfilter bool ke string selalu menghasilkan False .

Kode Template

Paste the template code (ideally a minimal example) that causes the issue

'{{6 > 0}}' ==> True
'{{6 > 0|string}}' ==> False
'{{6 > 0|bool}}' ==> True
'{{6 > 0|bool|string}}' ==> False

Lingkungan Anda

  • Versi Python: 2.7
  • Versi Jinja: Tidak tahu versi Jinja, Ansible adalah 2.5.4

Komentar yang paling membantu

{{ (some_var|length > 0) | string | lower }}

Lebih mudah dibaca, dan lebih jelas fungsinya

Semua 14 komentar

coba (6>0)|... atau bahkan lebih baik, boolean literal seperti true|... atau false|...

Ya, (6>0)|... berfungsi. Mengapa laporan bug ini ditutup?

Karena itu bukan bug, tetapi hanya prioritas operator. Tanpa tanda kurung, kode Anda mungkin berjalan sebagai 6 > (0|string) yang jelas tidak masuk akal, tetapi dalam operasi lain seperti 6 > '5'|int sangat masuk akal, jadi ini bukan bug atau perilaku yang tidak diinginkan.

Berasal dari dunia Unix/Linux di mana | menunjukkan pembatas pipa, ini tidak terduga.

Saya pikir itu seharusnya 6 > ('5'|int) sebagai gantinya ketika membutuhkan gips seperti itu.

Saya tidak setuju, dan ini juga akan menjadi perubahan besar-besaran.

Bisakah kita memiliki peringatan setidaknya?

Kasus penggunaan dunia nyata untuk ini adalah Ansible templating properti boolean Java:
isEnabled={{ some_var | length > 0 | string | lower }}
karena saya ingin isEnabled=true/false bukannya isEnabled=True/False .

Itu akan lebih mudah dibaca sebagai isEnabled={{ ((some_var | length) > 0) | string | lower }} (setidaknya bagi saya), yang saya yakini akan berfungsi seperti yang diharapkan.

{{ (some_var|length > 0) | string | lower }}

Lebih mudah dibaca, dan lebih jelas fungsinya

Yah, saya melihat kita membacanya secara berbeda dan Jinja saat ini membacanya seperti Anda. Tetapi bagian terburuk dari contoh tidak berfungsi di atas adalah selalu diam-diam memberikan False .

Saya tahu Python senang dengan itu tetapi menurut Anda apakah ide yang baik untuk mengeluarkan peringatan saat menggunakan > antara int dan string di template Jinja?

Juga tolong bagikan pendapat Anda tentang filter |is_empty untuk digunakan sebagai ganti |lenght > 0 .

Bagaimanapun, terima kasih atas tanggapan cepat Anda. Semoga minggumu menyenangkan.

Ansible dapat menambahkan ini. Seperti yang mereka lakukan dengan |bool yang juga bukan bagian dari Jinja itu sendiri.

Saya tahu Python senang dengan itu tetapi menurut Anda apakah ide yang baik untuk mengeluarkan peringatan saat menggunakan > antara int dan string dalam templat Jinja?

Belum mengujinya, tetapi mungkin gagal di Python 3 di mana perbandingan seperti itu gagal dengan keras alih-alih berhasil secara diam-diam dengan hasil yang agak tidak berguna. Jinja tidak melakukan pemeriksaan tipe, jadi hanya meneruskan dua operan ke Python (tidak memeriksa kode, mungkin ia memanggil operator.gt(a, b) untuk itu)

Senang mengetahuinya, terima kasih.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat