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?
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
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.