在没有NoneType错误的情况下访问嵌套dicts的pythonic方法是什么

Ken*_*ker 2 python dictionary styles nonetype keyerror

我有一个深嵌套的dict(从json解码,来自instagram api).我的初始代码是这样的:

caption = post['caption']['text']
Run Code Online (Sandbox Code Playgroud)

但是如果'caption'键或'text'键不存在,那将抛出NoneType或KeyError错误.

所以我想出了这个:

caption = post.get('caption', {}).get("text")
Run Code Online (Sandbox Code Playgroud)

哪个有效,但我不确定它的风格.例如,如果我将此技术应用于我正在尝试检索的更深层次的嵌套属性之一,它看起来非常难看:

image_url = post.get('images',{}).get('standard_resolution',{}).get('url')
Run Code Online (Sandbox Code Playgroud)

有没有更好,更pythonic的方式来写这个?我的目标是检索数据(如果有的话),但如果数据不存在则不会阻止执行.

谢谢!

Tec*_*gon 14

Python 3.4 和更新版本包含一个 contextlib 上下文管理器suppress,它正是用于此类事情。当您提前知道特定错误可能发生并且您的代码可以处理它时,抑制特定错误。

from contextlib import suppress

sample = {'foo': 'bar'}

with suppress(KeyError):
    print(sample['baz'])
Run Code Online (Sandbox Code Playgroud)

将阻止KeyError被提升。

因此,为了访问深度嵌套的字典值,您可以suppress这样使用。

value = None
with suppress(KeyError):
    value = data['deeply']['nested']['dictionary']['key']
Run Code Online (Sandbox Code Playgroud)


nne*_*neo 10

最恐怖的方式就是抓住KeyError:

try:
    caption = post['caption']['text']
except KeyError:
    caption = None
Run Code Online (Sandbox Code Playgroud)

对于Python程序员来说,这很简单,明显且易于理解.

  • 固定,向PEP 8道歉. (2认同)
  • 您可以定义一个函数来检索带有 try/ except 的键列表。 (2认同)