Так что документы Twitter API, вероятно, немного лгут о том, что они возвращают (шок ужас!), И похоже, что вы получаете None
вместо ожидаемой структуры данных.Вы уже отказались от использования try, catch, поэтому я не буду об этом говорить, но вот несколько других предложений.
Использование dict get () default
Мне приходит в голову пара опций, во-первых, использовать возможность по умолчанию команды dict get.Вы можете обеспечить откат, если ожидаемый ключ не существует, что позволяет объединить несколько вызовов в цепочку.
Например, вы можете достичь большей части того, что вы пытаетесь сделать, с помощью следующего:
return {
'text': data.get('extended_tweet', {}).get('full_text', data['text']),
'coordinates': data.get('coordinates', {}).get('coordinates', 'null')
}
Это не супер красиво, но работает.Вероятно, это будет немного медленнее, чем то, что вы делаете.
Использование JSONPath
Другой вариант, который, вероятно, излишний для этой ситуации, заключается в использовании JSONPath библиотека, которая позволит вам искать в структурах данных элементы, соответствующие запросу.Что-то вроде:
from jsonpath_rw import parse
matches = parse('extended_tweet.full_text').find(data)
if matches:
print(matches[0].value)
Это будет намного медленнее, чем то, что вы делаете, и только для нескольких полей это излишне, но если вы выполняете много такого рода работы, это может бытьудобный инструмент в коробке.JSONPath также может выражать гораздо более сложные пути или очень глубоко вложенные пути, где метод get может не работать или будет неудобен.
Сначала проанализируйте JSON!
Последнее, что я хотел бы упомянуть, это убедиться, что вы анализируете свой JSON, прежде чем выполнять тест для "retweeted_status"
.Если текст появляется где-либо (скажем, внутри текста твита), этот тест будет запущен.
Разбор JSON с компетентной библиотекой также обычно очень быстрый, поэтому, если у вас нет реальных проблем со скоростью, не обязательно беспокоитьсяо.