Python —仅在变量存在时传递参数
问题内容:
我有以下变量,用户可以选择通过表单提交这些变量(不是必需的,但可以这样做以过滤搜索)。
color = request.GET.get ('color')
size = request.GET.get ('size')
现在,我想将这些变量传递给函数,但前提是它们存在。如果它们不存在,我只想运行不带参数的函数。
没有参数的函数是:
apicall = search ()
只有颜色
apicall = search (color)
并带有颜色和尺寸
apicall = search (color, size)
如果定义了参数,我想将其传递给函数,但是如果没有定义,我就不想将其传递给函数。
最有效的方法是什么?python是否为此具有内置方法?
问题答案:
假设这是一个标准get
调用(例如在字典上),这应该很容易。使用None
参数的默认值定义函数,然后通过color
且size
无需费心检查它们!
def apicall(color=None, size=None):
pass # Do stuff
color = request.GET.get('color')
size = request.GET.get('size')
apicall(color, size)
这样,您只需要None
在一个地方检查参数(在函数调用内部,无论如何都必须检查函数是否可以通过多种方式调用)。一切都保持良好和清洁。当然,这假设(就像我在顶部说的那样)您的get
调用就像是普通的Python字典的get
方法,None
如果找不到该值,则会返回。
最后,我注意到您的函数名称是apicall
:您实际上可能无法访问函数代码本身。在这种情况下,由于您可能对函数签名的默认值一无所知并且None
可能是错误的,因此我可能只编写一个简单的包装器为您执行参数检查。然后,您可以如上所述调用包装器!
def wrapped_apicall(color=None, size=None):
if color is None and size is None:
return apicall()
# At least one argument is not None, so...
if size is None:
# color is not None
return apicall(color)
if color is None:
# size is not None
return apicall(size)
# Neither argument is None
return apicall(color, size)
注意: 除非您看不到要调用的代码并且没有任何文档,否则 不需要
第二个版本!使用None
的默认参数是很常见的,所以有机会,你可以只使用第一种方式。如果您无法修改正在调用的函数并且不知道其默认参数是什么(或者其默认参数是模块常量之类的东西,但这很少见),我只会使用wrapper方法。