Jinja: مربك الخطأ مع Python 3 والقوالب التي تستخدم iteritems ()

تم إنشاؤها على ٢٧ سبتمبر ٢٠١٢  ·  5تعليقات  ·  مصدر: pallets/jinja

انصح:

#!/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))

عند تشغيل w / Python 3 ، تحصل على استثناء محير:

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'"

هذا لأن القالب يستخدم العناصر التكرارية ، والتي تمت إزالتها في Python 3. من الاستثناء أعلاه ، ليس من الواضح أن المشكلة في القالب - يجب أن تكون كذلك.

إنه يعمل مع قواميس Python 3 العادية لأن الأسطر 205-210 من Jinja2 v2.61 تضيف طريقة iteritems:

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

ما هي أفضل طريقة لإصلاح هذا؟ هل من الأفضل الكشف عن الكائنات التي تشبه الديكت ، حاول أن تبصق خطأ أفضل ، وما إلى ذلك؟

التعليق الأكثر فائدة

لا تحتوي القواميس على طرق تكرارية في 3.x. ستحتاج إلى التغيير إلى .items() . لا شيء يمكنني القيام به حيال ذلك.

ال 5 كومينتر

لا تحتوي القواميس على طرق تكرارية في 3.x. ستحتاج إلى التغيير إلى .items() . لا شيء يمكنني القيام به حيال ذلك.

سيكون من الجيد لو كان هناك مرشح مدمج لهذا الشذوذ وغيره من أنواع python 2to3.

ما لم يكن لديك إملاءات ضخمة ، فإن استخدام .items() ليس / هذا / سيئًا

إليك طريقة للالتفاف حوله:

استيراد ستة

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

ثم في القالب الخاص بك:

استعمال:
{٪ للمفتاح ، القيمة في ستة_ معايير (متغيرك)٪}

إنه قبيح نوعًا ما ، لكنه يعمل.

باستخدام .items () بدلاً من ذلك .iteritems () نجح

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات