我正在使用API调用,因此使用Python字典.
但是,对于相同的请求,我并不总是键入相同的键,我想知道何时可以在没有异常的情况下调用键...
让我说我有
test = {'a':{'b':{'c':{'d':'e'}}}}
Run Code Online (Sandbox Code Playgroud)
有时密钥d会存在,有时则不会.有时c甚至不存在.
我想以某种方式test['a']['b']['c']['d']在一行中检查是否存在.
到目前为止我尝试过的:
用test.get('a', {}).get('b', {}).get('c', {}).get('d', {}).工作正常,但它是一个烂摊子,有时我有5-6个嵌套的词典,名字很长......
使用try/except块很好,但通常如果test['a']['b']['c']['d']不存在,我会尝试调用test['a']['b']['e']['f']检查是否存在,因此我需要为每个if语句添加一个try/catch,就好像我没有错,如果异常是catch,则不再执行try块.
我可能试图寻找一种反身的方式来做这件事,调用一个函数,将我的"对象"的名称作为字符串,检查每个键是否存在,如果存在,则返回对象本身.
有什么想法吗 ?
它背后的用法是,省略无用的情况,并假设有时信息在测试['a'] ['b'] ['c'] ['d'],有时在测试['a'] [' b'] ['f']:
if test['a']['b']['c']['d'] **exists**:
do sthg with the value of test['a']['b']['c']['d']
elif test['a']['b']['f'] **exists**:
do sthg else with the value of test['a']['b']['f']
else:
do sthg different
Run Code Online (Sandbox Code Playgroud)
如果我把try/except放在那里,第一个异常不会停止执行并且不让我执行elif吗?
而且,我真的很喜欢打电话的方式而test['a']['b']['c']['d']不是给出一个按键列表.事实上,我希望它对我和那些阅读/使用我的代码的人们尽可能透明.
谢谢 !
如果您使用 JSON,则可以编写一个简单的类,以便在导入字典时与它一起使用。
给出以下 JSON:
>>> js='{"a": {"b": {"c": {"d": "e"}}}}'
Run Code Online (Sandbox Code Playgroud)
如果它由对象对组成,通常会被解码为 Python 字典:
>>> import json
>>> json.loads(js)
{u'a': {u'b': {u'c': {u'd': u'e'}}}}
Run Code Online (Sandbox Code Playgroud)
作为一个普通的 Python 字典,它可能会KeyError缺少键。您可以使用__missing__钩子来覆盖KeyErrors并实现原始结构:
class Mdict(dict):
def __missing__(self, key):
return False
Run Code Online (Sandbox Code Playgroud)
现在测试一下:
>>> md=Mdict({'a':Mdict({'b':Mdict({'c':Mdict({'d':'e'})})})})
>>> if md['a']['b']['d']:
... print md['a']['b']['d']
... elif md['a']['b']['c']:
... print 'elif', md['a']['b']['c']
...
elif {'d': 'e'}
Run Code Online (Sandbox Code Playgroud)
字典的每个级别都需要是一个Mdict普通的 Python dict。但是,如果您使用 JSON,那么这很容易实现。只需在解码 JSON 时应用object_pairs_hook即可:
>>> js
'{"a": {"b": {"c": {"d": "e"}}}}'
>>> md=json.loads(js, object_pairs_hook=Mdict)
Run Code Online (Sandbox Code Playgroud)
当 JSON 被解码时,这会应用该类Mdict而不是默认的 Python 。dict
>>> md
{u'a': {u'b': {u'c': {u'd': u'e'}}}}
>>> md['a']
{u'b': {u'c': {u'd': u'e'}}}
>>> md['a']['c']
False
Run Code Online (Sandbox Code Playgroud)
此处示例的其余部分保持不变。