Jinja: Python 3とiteritems()を使用するテンプレートで混乱するエラー

作成日 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'"

これは、テンプレートがPython 3で削除されたiteritemsを使用しているためです。上記の例外から、問題がテンプレートにあるかどうかは明らかではありません。

Jinja2 v2.61の205〜210行目でitereitemsメソッドが追加されているため、通常のPython3ディクショナリで機能します。

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

これを修正する最良の方法は何ですか? dictのようなオブジェクトをより適切に検出し、より適切なエラーを吐き出そうとしますか?

最も参考になるコメント

3.xでは、辞書にiteitemメソッドはありません。 .items()に変更する必要があります。 それについて私にできることは何もありません。

全てのコメント5件

3.xでは、辞書にiteitemメソッドはありません。 .items()に変更する必要があります。 それについて私にできることは何もありません。

これと他のPython2to3の奇妙なもののための組み込みフィルターがあればいいのにと思います。

あなたが巨大な口述を持っていない限り、 .items()を使用することは/ that /悪いことではありません

これを回避する方法は次のとおりです。

6つインポート

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

次に、テンプレートで:

使用する:
{キーの%、six_iteritems(your var)の値%}

ちょっと醜いですが、うまくいきます。

代わりに.items()を使用すると.iteritems()が機能しました

このページは役に立ちましたか?
0 / 5 - 0 評価