繁体   English   中英

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

[英]Python, How not to pass a keyword argument to a method when the argument is None?

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

如下所述,我使用if语句在参数为None时不将关键字参数传递给子函数。 我想以更好的方式做到这一点。

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

# 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

对于第一个示例, 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

sorted的函数的参数key的默认值为None 因此,不需要您的第一个if / else 使用简单

alist = sorted(alist, key=key)

使用es.indices.create body的默认值作为函数create_index mapping的默认值。 然后,您也可以在此函数中删除if / else

编辑: 文档说:

正文–文件

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

def create_index(index_name, mapping="{}"):

编辑2:使用空的dict无效(请参见评论中的链接)。 因此,在第二种情况下,您将不得不使用if / else

如前所述,对于排序,您基本上只是打包原始功能。 对于第二个示例,我认为您不能避免使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM