Jinja: 使用 iteritems() 的 Python 3 和模板的混淆错误

创建于 2012-09-27  ·  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))

当使用 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'"

这是因为模板使用了 iteritems,它在 Python 3 中被删除了。从上面的异常来看,不清楚问题出在模板中——它应该是。

它适用于普通的 Python 3 字典,因为 Jinja2 v2.61 的第 205-210 行添加了一个 iteritems 方法:

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

解决此问题的最佳方法是什么? 更好地检测类似 dict 的对象,尝试吐出更好的错误等?

最有用的评论

字典在 3.x 中没有 iteritem 方法。 您需要更改为.items() 。 我对此无能为力。

所有5条评论

字典在 3.x 中没有 iteritem 方法。 您需要更改为.items() 。 我对此无能为力。

如果有一个内置的过滤器来处理这个和其他 python 2to3 奇怪的东西,那就太好了。

除非你有大量的字典,否则使用.items()不是/那/坏

这是绕过它的方法:

进口六

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

然后在您的模板中:

用:
{% for key, value in Six_iteritems(your var) %}

这有点难看,但确实有效。

使用 .items() 代替 .iteritems() 工作

此页面是否有帮助?
0 / 5 - 0 等级