[英]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.