关于python:使用可选键创建有效负载

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)

因此,我们创建了一个只保留非None值的新字典。

但您可能会将逻辑量减少到:

1
2
def create_payload(**kwargs):
    return {k: v for k, v in kwargs.items() if v is not None}

在这里可以调用create_payload函数将各种参数,它将返回一个字典,其中包含所有非None值。如果您还想包括这些内容,那么它甚至只是:

1
2
def create_payload(**kwargs):
    return kwargs