.get + dict variable



我有一个电荷对象,其中包含charge['metadata']['distinct_id']中的信息。可能存在未设置的情况,因此我尝试了这种方式

,这在charge.get(['metadata']['distinct_id'], None)

不起作用您知道如何以正确的方式做到这一点吗?

你没有说错误是什么,但是,有两件事可能是错误的

  • 应该是charge.get('metadata', None)
  • 你不能直接在两个连续的层面上做到这一点。如果metadata键返回None,则无法继续要求distinct_id键。您可以返回一个空字典并对其应用get,例如charge.get('metadata', {}).get('distinct_id', None)

这不是您查询此内容的方式:应该为.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')

正如@blue_note提到的,你不能使用两个连续的级别。但是,您可以尝试类似的东西charge.get('metadata', {}).get('distinct_id')

在这里,您尝试从收费中获取"元数据",如果未找到,它将考虑空白字典并尝试从那里获取"distinct_id"(技术上它不存在(。在这种情况下,您无需担心元数据是否存在。如果存在,那么它将检查元数据中的distinct_id,否则它将抛出 None。

希望这能解决您的问题。

干杯。。!

最新更新