考虑:
#!/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()
。 我对此无能为力。
如果有一个内置的过滤器来处理这个和其他 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() 工作
最有用的评论
字典在 3.x 中没有 iteritem 方法。 您需要更改为
.items()
。 我对此无能为力。