TypeError:“NoneType”对象不是不可读取的问题。如何绕过空语句?

2024-05-14 22:26:49 发布

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

我试图找到一条推文的发送位置,有些人显然在他们的微博上没有位置设置,所以我想知道如何绕过“TypeError:'NoneType'object is not iterable”并在其位置显示“not identified”答案?在

我使用isL`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']

`


Tags: 答案injsonfordataobjectisnot
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']

如果您不能依赖输入来遵循预期的格式,那么获得一个警告或至少比KeyErrorNoneType is not iterable更不迟钝的错误消息可能会有用。在

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回溯,而不是一个奇怪的NoneType回溯,它可能会远离实际的问题发生的地方,而是立即得到一个错误,它准确地显示了什么时候某些东西不是您所期望的。在

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

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

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

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

^{pr2}$

相关问题 更多 >

    热门问题