在不出现NoneType错误的情况下,如何以Pythonic方式访问嵌套字典

7 投票
4 回答
4669 浏览
提问于 2025-04-17 16:50

我有一个很深的嵌套字典(是从 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程序员来说一看就懂。

撰写回答