Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理不存在的Python Dict键的Pythonic方法_Python_Json_Dictionary - Fatal编程技术网

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

处理不存在的Python Dict键的Pythonic方法,python,json,dictionary,Python,Json,Dictionary,我使用的API返回一个JSON对象,我可以轻松地将其转换为dict。我们将调用转换后的JSON to dict对象,JSON_API_ITEM 但是,有时JSON_API_项没有特定字段(例如url)。不是将该字段设置为“无”,而是该字段根本不存在,因此当我进行赋值时: url = JSON_API_ITEM['url'] 我的程序抛出一个异常。我曾想过在dict.keys()上使用for循环,或者将所有内容都放在try或if块中,但这会使我的代码非常难看 什么是蟒蛇式的处理方式 您可以使用这

我使用的API返回一个JSON对象,我可以轻松地将其转换为dict。我们将调用转换后的JSON to dict对象,JSON_API_ITEM

但是,有时JSON_API_项没有特定字段(例如url)。不是将该字段设置为“无”,而是该字段根本不存在,因此当我进行赋值时:

url = JSON_API_ITEM['url']
我的程序抛出一个异常。我曾想过在dict.keys()上使用for循环,或者将所有内容都放在try或if块中,但这会使我的代码非常难看

什么是蟒蛇式的处理方式

您可以使用这个方法

编辑:

我取消删除我的答案,因为在OP编辑之后,很明显问题在于从dict中获得价值,而不是作业

虽然
.get()
有效,而且是最短的(我认为)方法,但一种更为通灵的方法会更有效,或者“请求原谅比允许更容易”。这意味着try/except块是您应该如何执行的:

try:
    url = my_item['url']
except KeyError e:
    url = None
我在这里假设您是要编写
url=my_item['url']
,而不是
my_item['url']=url

我看到有关的答案被删除了。我也会解释的


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

,因为您的问题已更改,此答案超出范围,但仍会发布,以防有人需要分配到可能不存在的密钥,而不仅仅是需要访问

这是在加载的JSON中使用一个而不是一个dict来完成的。使用
对象钩
完成转换。每当扫描JSON对象时(通常会在Python中生成dict),就会调用这个钩子。在下面的示例中,
default\u工厂
只返回
None
,但是如果需要,您可以放置一些更有趣的内容(例如,一个空的dict,这样链接的
getitem
调用就不会失败)


等等,分配给缺少的字段时会出现异常?Dicts不应该这样做,这也不例外;如果
my_item
为None@user2357112也许他的钥匙坏了,这里提供的例子不正确。我仍然对你的问题感到困惑。你的意思是问关于最初获取dict值的问题吗?如果是,你为什么接受第一个答案?根据官方文件,EAFP更像蟒蛇。我删除了我的答案,因为问题是关于分配的,而不是关于获得价值,正如@Cilyan@Marcin-Huh所指出的那样……我想你是对的;OP特别提到了任务。真奇怪。他/她说“[他/她]的程序抛出了一个异常”,这显然不是。谢谢各位,当我写这篇文章的时候,我感觉很有趣,你们很快就抓住了它,我在谈论如何获得价值。对于糟糕的操作表示抱歉,并感谢您的帮助,几分钟后将更新结果。同时也感谢您在这篇关于作业的帖子中所做的贡献,这将帮助我度过我的职业生涯@KSFT我认为这是错误的:
url=my_item('url',None)
。你忘了
get
部分。@Cilyan OP编辑了这个问题,似乎是关于现在就获取,而不是关于作业。这正是我想要的,谢谢。对于那些使用嵌套字典的用户,请确保将整个路径(最后一个字段除外)放在.get()之前。例如:使用url=my_item['company'].get('name',None)代替url=my_item.get(['company']['name'],None)@Marcin:Lucky you:)删除注释。@uspowpow:不,Python语法不是这样工作的。这将尝试使用
'name'
作为单元素列表
['company']
的索引。您需要
my_item.get('company',{}).get('name',None)
try:
    url = my_item['url']
except KeyError e:
    url = None
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