检查嵌套属性是否存在。

6
我有一个嵌套的OrderedDict,我想从中提取一个值。但在提取该值之前,我必须确保一长串属性存在并且它们的值不为none。
以下是如何用最pythonic的方式改进代码:
if 'first' in data and \
    data['first'] and \
    'second' in data['first'] and \
    data['first']['second'] and \
    'third' in data['first']['second'] and \
    data['first']['second']['third']:
    x = data['first']['second']['third']
2个回答

7
另一种方法是使用get()方法:
x = data.get('first', {}).get('second', {}).get('third', None)

如果在任何时刻该键不存在,那么 x = None


1
如果其中一个字段设置为None,这将无法正常工作。例如:data = {'first': {'second': None}} - rob

3
您可以使用try/except块来包围它,如下所示:
try:
    x = data['first']['second']['third']
    assert x
except KeyError, AssertionError:
    pass

2
这里不应该使用 assert - vaultah
他想确保该值不是 None,这就是它存在的原因。 - Keenan
我需要为每个额外的赋值语句再加一个try catch块吗?例如,x=data['a']y=data['b'] - Colton Allen
只有当您不确定'a'和'b'是否为数据中的键时。 - Keenan
这里不需要使用assert x。正确的方式是:if x is None: raise ValueError() - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接