.get + dict变量

时间:2018-09-28 10:00:04

标签: python django

我有一个收费对象,其信息在charge['metadata']['distinct_id']中。可能存在未设置的情况,因此我尝试了这种方法,charge.get(['metadata']['distinct_id'], None)

不起作用

您知道该怎么做吗?

3 个答案:

答案 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。

希望这可以解决您的问题。

干杯..!