键确定存在时模板中的KeyError

时间:2014-03-28 14:16:56

标签: python tornado

我想在模板数据中呈现:[{'name': 'Some name', 'description': 'Description for this item'}]

我尝试使用此代码:

{% for item in source_data %}
    <tr>
        <td>{{ item['name'] }}</td>
        <td>{{ item['description'] }}</td>
    </tr>
{% end %}

它不起作用,因为我收到KeyError: 'description'例外。

但如果我将第二个占位符更改为{{ item.get('description') }},它会按预期工作(打印字典中的正确数据,而不是默认值)。

什么会产生这种错误?

1 个答案:

答案 0 :(得分:1)

看起来并非所有词典都有description键。

不是直接按键获取值,而是使用字典get()方法,如果找不到密钥,则不会抛出KeyError

{% for item in source_data %}
    <tr>
        <td>{{ item['name'] }}</td>
        <td>{{ item.get('description', 'No description') }}</td>
    </tr>
{% end %}

演示:

>>> from tornado import template
>>> source_data = [
...     {'name': 'Some name', 'description': 'Description for this item'},
...     {'name': 'test'}
... ]

>>> template1 = template.Template("""
... {% for item in source_data %}
...     {{ item['description'] }}
... {% end %}
... """)

>>> template2 = template.Template("""
... {% for item in source_data %}
...     {{ item.get('description', 'No description found') }}
... {% end %}
... """)

>>> print template1.generate(source_data=source_data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "tornado/template.py", line 278, in generate
    return execute()
  File "<string>.generated.py", line 7, in _tt_execute
KeyError: 'description'
>>> print template2.generate(source_data=source_data)

    Description for this item

    No description found

希望有所帮助。