【发布时间】:2015-06-05 23:36:34
【问题描述】:
我正在处理 API 调用和 Python 字典。
但是,对于相同的请求,我并不总是键入相同的键,我想知道何时可以调用没有异常的键...
假设我有
test = {'a':{'b':{'c':{'d':'e'}}}}
有时 key 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']来检查是否存在,因此我需要添加一个 try/catch我的每一条if语句,好像我没有错,如果catch了异常,try块就不再执行了。
我可能正试图寻找一种自反的方式来做到这一点,以我的“对象”的名称作为字符串调用一个函数,该函数将检查每个键是否存在,如果存在,则返回该对象自己。
有什么想法吗?
它背后的用法是,省略无用的情况,并假设有时信息在 test['a']['b']['c']['d'] 中,有时在 test['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
如果我在那里放了一个 try/except,第一个异常不会停止执行并且不让我执行 elif 吗?
此外,我真的很喜欢调用test['a']['b']['c']['d'] 的方式,而不是提供一个键列表。事实上,我希望它对我和阅读/使用我的代码的人来说尽可能透明。
【问题讨论】:
-
您的代码需要做什么?看来 try/except 块是正确的方法。你想要吗?失败的深度?
-
@remram 如果密钥 d 不存在,我的信息可能会在另一个密钥中。
if test['a']['b']['c']['d'] **exists**: do sthg elif test['a']['b']['e'] **exists**: do sthg else else: do sthg else如果我没记错的话,如果 test['a']['b']['c']['d'] 不存在并且一切都在 try/catch 中,那么 elif 甚至不会被处决吧? -
@cristian-ciupitu 不是真的。另一方面,假设密钥存在,OP 希望通过密钥列表访问值。老实说,我什至更喜欢调用 test['a']['b']['c'] 的正常方式,而不是提供所有解决方案目前都在使用的键列表:/
-
其实我很喜欢你原来的
.get(key,{})方法——而且比答案更好。