开发者问题收集

TypeError:'NoneType'对象不是可迭代问题。我该如何设法绕过空语句?

2019-04-06
355

我试图找到推文的发送位置,有些人显然没有在推文上设置位置,所以我想知道如何绕过“TypeError:'NoneType'对象不可迭代”并在其位置显示“未识别”答案?

我使用的代码是`import json

with open('tweets7.txt')as json_data:
    data = json.load(json_data)
    for r in data['results']:
        for b in  r['place']:
        print (r['place']['full_name'])
        break
    print r['text']

`

3个回答

在这种情况下,您可以使用 try / catch :)

with open('tweets7.txt')as json_data:
    data = json.load(json_data)
    for r in data['results']:
        try:
            for b in  r['place']:
                print (r['place']['full_name'])

        except TypeError:
            print("location not identified")

    print r['text']
David Silveiro
2019-04-06

如果要检查可迭代对象是否存在,可以使用:

isinstance(data['results'], list)
isinstance(data.get('results', None), list)

如果只想遍历data['results'],可以使用:

for r in data.get('results', []):
    # Todo: your code
    pass
cloudyyyyy
2019-04-06

如果您不能依赖输入来遵循您预期的格式,那么获得警告或至少比 KeyErrorNoneType 不可迭代 更清晰的错误消息可能会很有用。

def get_tweets(filename):
    with open(filename) )as json_data:
        data = json.load(json_data)
    if 'results' not in data:
        raise ValueError("No 'results' in {0!r}".format(data))
    if data['results'] is None:
        return []
    for r in data['results']:
        if 'place' not in r:
           raise ValueError("No 'place' in {0!r}".format(r))
        if r['place'] is not None:
            for b in  r['place']:
                print('.… Oops, forgot to do anything with b')
            print (r['place']['full_name'])
            break
    if 'text' not in r:
        raise ValueError("No 'text' in {0!r}".format(r))
    print r['text']

get_tweets('tweets7.txt')

如果您不习惯编写健壮的代码,那么一开始在每个可能的机会都引发错误似乎很奇怪。这里的关键教训是提供 有用的 错误报告来指示 到底 出了什么问题。您很快就会发现这显著提高了代码的可用性和可维护性;您不会看到距离实际问题发生地点可能有几十行的奇怪的、不具描述的 NoneType 回溯,而是会立即收到错误,该错误会准确显示某些事情并非您所期望的。

如果您认为您能够在调用代码中处理其中一些错误,请注意在每种情况下 raise 不同的错误,以便您可以准确决定要实现哪些 except 处理程序。(然后可能定义您自己的错误层次结构,而不是像我在这里所做的那样使用 Python 的通用 ValueError 。)

tripleee
2019-04-06