我有一个收费对象,其信息在charge['metadata']['distinct_id']
中。可能存在未设置的情况,因此我尝试了这种方法,charge.get(['metadata']['distinct_id'], None)
您知道该怎么做吗?
答案 0 :(得分:5)
您没有说出错误是什么,但是有两件事可能是错误的
charge.get('metadata', None)
metadata
键返回None
,则无法继续要求输入distinct_id
键。您可以返回一个空字典并对其应用get
,例如charge.get('metadata', {}).get('distinct_id', None)
答案 1 :(得分:2)
这不是您要查询的方式:应该为.get(..)
赋予键的值,而不是列表或此类下标语法。如果您写qux = foo.get('bar')
,则(由于foo
是字典)相当于:
try:
qux = foo['bar']
except KeyError:
qux = None
为了以“更安全”的方式获得charge['metadata']['distinct_id']
,我们可以这样写:
metadata = charge.get('metadata', None)
if metadata is not None:
meta_id = metadata.get('distinct_id')
如果您要传递密钥的链,我们可以提供以下帮助函数:
def get_chain(data, *ks, default=None):
dummy = object()
for k in ks:
data = data.get(k, dummy)
if data is dummy:
return default
return data
然后我们可以通过以下方式调用它:
meta_id = get_chain(charge, 'metadata', 'distinct_id')
答案 2 :(得分:1)
如@blue_note所述,您不能使用两个连续的级别。但是,您可以尝试类似
charge.get('metadata', {}).get('distinct_id')
在这里,您尝试从收费中获取“元数据”,如果找不到,则它将考虑空白字典并尝试从中获取“ distinct_id”(从技术上讲,它不存在)。在这种情况下,您不必担心元数据是否存在。如果存在,它将从元数据中检查distinguished_id,否则抛出None。
希望这可以解决您的问题。
干杯..!