我需要为静态Web API创建数据有效负载。字典的模板包含一些可选键。通常的方法是使用所有必需的键创建字典,然后逐个检查并添加可选键:
def create_payload(key1, key2, ..., key10=None,key11=None):
data = {
'key1' : key1,
'key2' : key2,
...
'nested' : {}
}
if key10:
data[ 'nested' ][ 'key10' ] = key10
if key11:
data[ 'key11' ] = key11
return data
是否有其他方法可以从数据模板开始,然后自动删除“无”的可选键?
def create_payload(key1, key2, ..., key10=None,key11=None):
data = {
'key1' : key1,
'key2' : key2,
...
'nested' : {
'key10' : key10
},
'key11' : key11
}
# delete keys that are None
return data
更新 你们中的一些人建议做字典理解以删除None键:
{k: v for k, v in metadata.items() if v is not None}
在尝试创建一个简单示例时,我没有考虑到某些键可能会嵌套的可能性。 (我正在更新上面的示例。)是否存在可以排除嵌套键内的None值的字典理解?
答案 0 :(得分:1)
是的,您可以使用例如字典理解:
return {k: v for k, v in data.items() if v is not None}
或用于嵌套结构:
def create_payload(key1, key2, key10=None,key11=None):
data = {
# ...
}
def strip_nones(dc):
return {
k: strip_nones(v) if isinstance(v, dict) else v
for k, v in dc.items() if v is not None
}
return strip_nones(data)
因此,我们创建了一个仅保留非None
值的新字典。
但是您可以将逻辑量减少为:
def create_payload(**kwargs):
return {k: v for k, v in kwargs.items() if v is not None}
在这里您可以调用create_payload
函数将使用各种参数,并且它将返回包含所有非None
值的字典。如果您还希望包括这些内容,那么它甚至很简单:
def create_payload(**kwargs):
return kwargs