在不出现NoneType错误的情况下,如何以Pythonic方式访问嵌套字典
我有一个很深的嵌套字典(是从 Instagram API 解码的 JSON 数据)。
我最开始的代码是这样的:
caption = post['caption']['text']
但是如果 'caption' 这个键或者 'text' 这个键不存在,就会报 NoneType 或 KeyError 的错误。
所以我想出了这个方法:
caption = post.get('caption', {}).get("text")
这个方法可以用,但我不太确定这样写是否好。例如,如果我把这个技巧应用到我想要获取的更深层次的属性上,看起来就很糟糕:
image_url = post.get('images',{}).get('standard_resolution',{}).get('url')
有没有更好、更符合 Python 风格的写法?我的目标是获取数据,如果数据存在的话,但如果不存在的话,不想让程序停下来。
谢谢!
4 个回答
2
你对这样的事情有什么看法呢?
if 'caption' in post:
caption = post['caption']['text']
不过,这种方法也开始出现问题了。
if 'images' in post and 'standard_resolution' in post['images']:
image_url = post['images']['standard_resolution']['url']
所以我觉得最符合Python风格的做法就是直接先尝试一下,再说对不起,而不是事先请求允许。
try:
image_url = post['images']['standard_resolution']['url']
except KeyError:
image_url = None
14
Python 3.4及更新版本中有一个叫做contextlib的上下文管理器,里面有个功能叫做suppress
,专门用来处理这种情况。也就是说,当你知道某些错误可能会发生,而你的代码能够处理这些错误时,可以选择忽略这些特定的错误。
from contextlib import suppress
sample = {'foo': 'bar'}
with suppress(KeyError):
print(sample['baz'])
这样就可以避免出现KeyError
错误。
所以,如果你想获取一个嵌套很深的字典中的值,可以像这样使用suppress
。
value = None
with suppress(KeyError):
value = data['deeply']['nested']['dictionary']['key']
12
最符合Python风格的方法就是直接捕获KeyError
错误:
try:
caption = post['caption']['text']
except KeyError:
caption = None
这样做简单明了,对于Python程序员来说一看就懂。