Python,当参数为None时,如何不将关键字参数传递给方法?

时间:2018-07-19 08:04:56

标签: python keyword-argument

我写了两个共享相同模式的示例代码。

正如您在下面可以看到的,如果参数为None,我使用if语句不将关键字参数传递给子函数。 我想做得更好。

如果您有想法,请分享您的想法。

# example_1
def mysort(alist, key=None):
    if key is None:
        alist = sorted(alist)
    else:
        alist = sorted(alist, key=key)

    return alist

# example_2
def create_index(index_name, mapping=None):
    es = Elasticsearch()
    if mapping in None:
        response = es.indices.create(index=index_name)
    else:
        response = es.indices.create(index=index_name, body=mapping)
    return respone

3 个答案:

答案 0 :(得分:0)

对于第一个示例,key的默认值为None,因此您可以直接将其传递:

# example_1
def mysort(alist, key=None):
    alist = sorted(alist, key=key)
    return alist

您还可以设置其他默认值。例如,新的默认值123将传递给sorted

# example_1
def mysort(alist, key=some_key):
    alist = sorted(alist, key=key)
    return alist

答案 1 :(得分:0)

函数sorted的参数<my-component [callback]="showMessage"></my-component> 的默认值为key。因此,您不需要第一个None / if。简单使用

else

使用alist = sorted(alist, key=key) 的{​​{1}}的默认值作为函数bodyes.indices.create的默认值。然后,您也可以在此函数中摆脱mapping / create_index

编辑: documentation说:

  

正文–文档

尝试找出这是代表文档的JSON字符串还是Python字典。在JSON字符串的情况下,使用字符串if作为默认值:

else

编辑2:不能使用空字典(请参见评论中的链接)。因此,在第二种情况下,您将不得不使用"{}" / def create_index(index_name, mapping="{}"):

答案 2 :(得分:0)

如前所述,对于排序,您基本上只是打包原始功能。对于第二个示例,我认为您不能避免使用if,但可以将其缩短一些。

def create_index(index_name, mapping=None):
    kwargs = {'index': index_name}
    if mapping is not None:
        kwargs['body'] = mapping
    return Elasticsearch().indices.create(**kwargs)