Jinja: Kesalahan yang membingungkan dengan Python 3 dan templat yang menggunakan iteritems()

Dibuat pada 27 Sep 2012  ·  5Komentar  ·  Sumber: pallets/jinja

Mempertimbangkan:

#!/usr/bin/env python3

from collections import OrderedDict

import jinja2

t = '''
{% for key, value in d.iteritems() %}
* {{ key }}: {{ value }}
{% endfor %}
'''

jt = jinja2.Template(t)

d = OrderedDict()
d['one'] = 1
d['two'] = 2
d['three'] = 3

print(jt.render(d=d))

Saat menjalankan w/ Python 3, Anda mendapatkan pengecualian yang membingungkan:

Traceback (most recent call last):
  File "jinja2-OrderedDict.py", line 20, in <module>
    print(jt.render(d=d))
  File "/usr/lib/python3/dist-packages/jinja2/environment.py", line 895, in render
    return self.environment.handle_exception(exc_info, True)
  File "/usr/lib/python3/dist-packages/jinja2/environment.py", line 671, in handle_exception
    raise exc_value.with_traceback(tb)
  File "<template>", line 2, in <module>
jinja2.exceptions.UndefinedError: b"'collections.OrderedDict object' has no attribute 'iteritems'"

Ini karena template menggunakan itemitem, yang dihapus dengan Python 3. Dari pengecualian di atas, tidak jelas masalahnya ada di template—seharusnya.

Ini berfungsi untuk kamus Python 3 normal karena baris 205–210 dari Jinja2 v2.61 menambahkan kembali metode iteritems:

    # not available on python 3
    if hasattr(dict, 'iterkeys'):
        iterkeys = _all('iterkeys')
        itervalues = _all('itervalues')
        iteritems = _all('iteritems')
    del _all

Apa cara terbaik untuk memperbaikinya? Lebih baik mendeteksi objek seperti dict, mencoba memuntahkan kesalahan yang lebih baik, dll?

Komentar yang paling membantu

Kamus tidak memiliki metode iteritem di 3.x. Anda perlu mengubah ke .items() . Tidak ada yang bisa saya lakukan tentang itu.

Semua 5 komentar

Kamus tidak memiliki metode iteritem di 3.x. Anda perlu mengubah ke .items() . Tidak ada yang bisa saya lakukan tentang itu.

Akan lebih baik jika ada filter bawaan untuk ini dan keanehan python 2to3 lainnya.

Kecuali jika Anda memiliki dicts besar, menggunakan .items() tidak /itu/ buruk

Berikut cara untuk menyiasatinya:

impor enam

env = jinja2.Environment(loader=jinja2.FileSystemLoader('your_dir'))
env.globals['six_iteritems'] = six.iteritems
template = env.get_template('your_template')

Kemudian di templat Anda:

menggunakan:
{% untuk kunci, nilai dalam enam_item(var Anda) %}

Ini agak jelek, tapi itu berhasil.

menggunakan .items() sebagai gantinya .iteritems() berhasil

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

htgoebel picture htgoebel  ·  4Komentar

hvnsweeting picture hvnsweeting  ·  4Komentar

mitsuhiko picture mitsuhiko  ·  3Komentar

Xion picture Xion  ·  5Komentar

AMDmi3 picture AMDmi3  ·  4Komentar