如何即使对于“None”类型也不抛出错误?

2024-09-24 06:29:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建HTML格式(用于发送自动电子邮件)从JSON数据,我从一个内部数据库获得,我得到以下错误为'无'类型,我想捕捉'无'类型以及?如何即使对于“None”类型也不抛出错误?你知道吗

你知道吗输入:-你知道吗

{'total': 0, 'Resolution': None, 'key': u'CNSSDEBUG-151394', 'summary': u'[Lenovo][NFA344A][Win10] - [QCA6174_9377.WIN.1.0-10366-QCARMTFX86WZ-2] - Undetermined crash root cause'}

你知道吗代码:-你知道吗

........
    for item in jiradb :
        MailBody = MailBody + "<tr>"
        MailBody = MailBody + "<td>" + str(icount) + "</td>"
        print item['key']
        MailBody = MailBody + "<td>" + item['key'].rstrip('\n!') + "</td>"
        MailBody = MailBody + "<td>" + item['summary'].rstrip('\n!') + "</td>"
        MailBody = MailBody + "<td>" + item['Resolution'].rstrip('\n!') + "</td>"
        icount = icount + 1

。。。。。。。。。。。。。。。。。。。。。。。你知道吗

你知道吗错误:-你知道吗

Traceback (most recent call last):
  File "sns.py", line 217, in <module>
    main()
  File "sns.py", line 215, in main
    sendmail(meta,jiradb,total_no_crashes)
  File "sns.py", line 47, in sendmail
    MailBody = MailBody + "<td>" + item['Resolution'].rstrip('\n!') + "</td>"
AttributeError: 'NoneType' object has no attribute 'rstrip'

Tags: keyinpynone类型错误lineitem
2条回答

使用dict.get(key,default)从dict中提取每个字段以避免丢失字段,然后使用or覆盖None大小写

例如

item['Resolution'].rstrip('\n!')

变成

(item.get('Resolution', None) or '').rstrip('\n!')

那么您可能需要一个helper函数

   def get_field(item, field, default=''):
       return (item.get(field, None) or default).rstrip('\n!')

这样你的循环就更干净了,你就更安全了

........
    for item in jiradb :
        MailBody = MailBody + "<tr>"
        MailBody = MailBody + "<td>" + str(icount) + "</td>"
        print get_field(item, 'key')
        MailBody = MailBody + "<td>" + get_field(item,'key') + "</td>"
        MailBody = MailBody + "<td>" + get_field(item,'summary') + "</td>"
        MailBody = MailBody + "<td>" + get_field(item,'Resolution') + "</td>"
        icount = icount + 1

这个答案听起来可能太宽泛了,但我建议切换到模板引擎,比如^{}^{},而不是尝试使用字符串串联来手动构造HTML。您可以通过使用变量占位符和内置或自定义过滤器来解决这类问题。你知道吗

作为奖励,您可以很好地分离逻辑(Python代码)和表示(生成的HTML)。一个更干净、更易测试的代码。你知道吗


下面是一个使用jinja2(创建了custom ^{} filter)的工作示例:

from jinja2 import Environment, FileSystemLoader

jiradb = [
    {'total': 0, 'Resolution': None, 'key': u'CNSSDEBUG-151394', 'summary': u'[Lenovo][NFA344A][Win10] - [QCA6174_9377.WIN.1.0-10366-QCARMTFX86WZ-2] - Undetermined crash root cause'},
    {'total': 1, 'Resolution': 'fixed', 'key': u'CNSSDEBUG-151395', 'summary': u'Some other summary'},
]

env = Environment(loader=FileSystemLoader('.'))
env.filters['rstrip'] = lambda value, s: value.rstrip(s) if value else ''

template = env.get_template('index.html')
print(template.render(jiradb=jiradb))

index.html内容:

<table>
    {% for item in jiradb %}
        <tr>
            <td>{{ loop.index }}</td>
            <td>{{ item.key|rstrip("\n!") }}</td>
            <td>{{ item.summary|rstrip("\n!") }}</td>
            <td>{{ item.Resolution|rstrip("\n!") }}</td>
        </tr>
    {% endfor %}
</table>

印刷品:

<table>
    <tr>
        <td>1</td>
        <td>CNSSDEBUG-151394</td>
        <td>[Lenovo][NFA344A][Win10] - [QCA6174_9377.WIN.1.0-10366-QCARMTFX86WZ-2] - Undetermined crash root cause</td>
        <td></td>
    </tr>

    <tr>
        <td>2</td>
        <td>CNSSDEBUG-151395</td>
        <td>Some other summary</td>
        <td>fixed</td>
    </tr>
</table>

相关问题 更多 >