Python —仅在变量存在时传递参数


问题内容

我有以下变量,用户可以选择通过表单提交这些变量(不是必需的,但可以这样做以过滤搜索)。

color = request.GET.get ('color')
size = request.GET.get ('size')

现在,我想将这些变量传递给函数,但前提是它们存在。如果它们不存在,我只想运行不带参数的函数。

没有参数的函数是:

apicall = search ()

只有颜色

apicall = search (color)

并带有颜色和尺寸

apicall = search (color, size)

如果定义了参数,我想将其传递给函数,但是如果没有定义,我就不想将其传递给函数。

最有效的方法是什么?python是否为此具有内置方法?


问题答案:

假设这是一个标准get调用(例如在字典上),这应该很容易。使用None参数的默认值定义函数,然后通过colorsize无需费心检查它们!

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方法。