使用可选键创建有效负载

时间:2018-08-06 08:37:12

标签: python django

我需要为静态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值的字典理解?

1 个答案:

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