Pythonic方式处理不存在的Python Dict键

时间:2015-03-29 23:32:58

标签: python json dictionary

我正在使用一个返回JSON对象的API,我很容易将其转换为dict。我们将调用转换后的JSON-to-dict对象JSON_API_ITEM。

但是,有时JSON_API_ITEM没有某些字段(例如url)。而不是将该字段设置为None,该字段根本不存在,因此当我进行分配时:

url = JSON_API_ITEM['url']

我的程序抛出异常。我想过在dict.keys()中使用for循环或将所有内容放在try或if块中,但这会使我的代码非常难看。

处理这样的事情的pythonic方法是什么?

3 个答案:

答案 0 :(得分:3)

尽管.get()有效并且是最短(我认为)这样做的方式,但更多的Pythonic方式是EAFP或者#34;比宽容更容易要求宽恕"。这意味着try / except块是您应该如何做的:

try:
    url = my_item['url']
except KeyError e:
    url = None

我在这里假设您打算写url = my_item['url'],而不是my_item['url'] = url

我看到有关.get()的答案已被删除。我也会解释它。

您可以使用url = my_item.get('url',None); dict.get()的第二个参数是默认值。它实际上默认为None,因此您只需编写utl = my_item.get('url')

即可

答案 1 :(得分:2)

您可以使用get方法。

my_item.get('url',None) # None is default in case url key does not exist.

编辑:

我取消删除我的答案,因为在OP编辑之后,明确的问题是关于从字典中获取价值,而不是关于作业。

答案 2 :(得分:0)

当你的问题发生变化时,这个答案超出了范围,但是如果有人需要将分配分配给可能不存在的密钥,而不是仅仅需要访问 EM>

这是在加载的JSON中使用defaultdict而不是dict完成的。转换是使用object_hook完成的。每当扫描一个JSON对象时调用此钩子(这通常会导致Python中的dict)。在下面的示例中,default_factory只返回None,但如果您愿意,可以为您的目的放置一些更有趣的内容(例如,一个空的dict,以便链式getitem调用不要失败)。

samplejson = """
{
    "menu": {
        "id": "file",
        "value": "File",
        "popup": {
            "menuitem": [
                { "value": "New", "onclick": "CreateNewDoc()" },
                { "value": "Open", "onclick": "OpenDoc()" },
                { "value": "Close", "onclick": "CloseDoc()" }
            ]
        }
    }
}
"""

jsobject = json.loads(
    samplejson,
    object_hook=lambda obj: collections.defaultdict(lambda:None, **obj)
)

print(jsobject["menu"]["id"])
print(jsobject["menu"]["tooltip"])
jsobject["menu"]["tooltip"] = "File menu"
jsobject["menu"]["accel"] = "Alt+F"
print(jsobject["menu"]["accel"])
print(jsobject["menu"]["tooltip"])

#Output:
#file
#None
#Alt+F
#File menu