Creating a payload with optional keys
我需要为一个RESTfulWebAPI创建一个数据负载。dict的模板包含一些可选键。通常的方法是用所有必需的键创建一个dict,然后逐个检查和添加可选键:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 |
是否有其他方法可以从数据模板开始,然后自动删除非可选键?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 |
更新你们中的一些人建议做字典理解来删除无键:
1 | {k: v for k, v in metadata.items() if v is not None} |
在我试图创建一个简单的示例时,我没有考虑某些键可能被嵌套的可能性。(我正在更新上面的示例。)是否有字典理解可以排除嵌套键中的无值?
是的,您可以使用例如字典理解:
1 | return {k: v for k, v in data.items() if v is not None} |
或对于嵌套结构:
1 2 3 4 5 6 7 8 9 10 | 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) |
因此,我们创建了一个只保留非
但您可能会将逻辑量减少到:
1 2 | def create_payload(**kwargs): return {k: v for k, v in kwargs.items() if v is not None} |
在这里可以调用
1 2 | def create_payload(**kwargs): return kwargs |