Python安全dict导航,正确的方法

2024-09-22 16:41:59 发布

您现在位置:Python中文网/ 问答频道 /正文

TLDR摘要

我编写了一个函数navigateDict,它在dict上执行安全导航,类似于dict.get(),但是嵌套的。它替代了代码

if 1 in data and 'i' in data[1] and 'a' in data[1]['i']:
    print data[1]['i']['a']
else:
    print "Not found"

大致相当于

^{pr2}$
  • 类似的东西是否已经是标准库的一部分了?在
  • 有没有更惯用的方法来做同样的事情?
    • 任何需要多次键入任何路径组件键的响应都可能是非响应。在

其他详细信息

具体实施如下:

# Allow fallback value other than None
def navigateDictEx(d, keys, fallback=None):
    for key in keys:
        if key in d:
            d = d[key]
        else:
            return fallback
    return d

def navigateDict(d, *keys):
    return navigateDictEx(d, keys)

有关用法示例,请参阅摘要。在

不管是否是python函数,在冗余不是一个好主意的地方,这个函数可以减少重复。例如,更改示例中的一个路径组件需要将最多三个不同的值修改为原始示例中的一个,但在修改后的示例中仅修改一个。考虑到我经常犯错误,这是一个很大的胜利。在

最后,我要问的是:标准库中是否有这样的东西,或者我需要在我的项目库中为它找到一个位置?在

如果命中率被认为是失误的主要原因

brionius正确地指出捕捉KeyError将起作用:

try:
    print data[1]['i']['a']
except KeyError:
    print "Not found"

这可能是我的方式;它非常简洁,减少了重复。然而,它确实反映了这样一个假设,即命中率将高于未命中率。如果有更好的方法来假设相反的情况,我也想知道。在


Tags: andkey函数in示例datareturnif
3条回答

一种方法是:

try:
    print data[1]['i']['a']
except KeyError:
    print "Not found!"

这符合鸭子打字的精神。它可能快也可能不快,因为我相信处理异常会带来一定的开销,但它肯定是“安全的”。在

这样的解决方案很酷

https://twitter.com/raymondh/status/343823801278140417

>>> from collections import defaultdict
>>> infinite_defaultdict = lambda: defaultdict(infinite_defaultdict)
>>> d = infinite_defaultdict() 
>>> d['x']['y']['z'] = 10
>>> if d['x']['y']['z']: print d['x']['y']['z'] #better reflects that misses are common

虽然游戏已经晚了很多年,但是对于任何一个偶然发现的人来说,似乎仍然没有一种本地的、流畅的方法来安全地导航Python dict

输入RestResponse

“restreponse的目标是成为一个流畅的python对象,用于与RESTful JSON api接口”

这个库包含一个NoneProp对象,它允许安全地导航(和构建)JSON数据结构。在

>>> import RestResponse
>>> data = RestResponse.parse({})
>>> data.property.is_none
None
>>> bool(data.property.is_none)
False
>>> isinstance(data.property.is_none, RestResponse.NoneProp)
True
>>> data.property.is_none = None
>>> isinstance(data.property.is_none, RestResponse.NoneProp)
False
>>> print data.pretty_print()
{
    "property": {
        "is_none": null
    }
}

相关问题 更多 >