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

use*_*021 16 python

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

color = request.GET.get ('color')
size = request.GET.get ('size')
Run Code Online (Sandbox Code Playgroud)

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

没有参数的函数是:

apicall = search ()
Run Code Online (Sandbox Code Playgroud)

只有它的颜色

apicall = search (color)
Run Code Online (Sandbox Code Playgroud)

它的颜色和大小

apicall = search (color, size)
Run Code Online (Sandbox Code Playgroud)

如果定义了参数,我想将它传递给函数,但如果不是,我不想传递它.

最有效的方法是什么?python有内置的方法吗?

Hen*_*ter 11

假设这是一个标准的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)
Run Code Online (Sandbox Code Playgroud)

这样,您只需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)
Run Code Online (Sandbox Code Playgroud)

注意:除非您看不到您正在调用的代码并且没有任何文档,否则不需要第二个版本!使用None默认参数非常常见,因此您可以使用第一种方式.我只会使用包装器方法,如果你不能修改你正在调用的函数,你不知道它的默认参数是什么(或者它的默认参数是模块常量或其他东西,但这很少见).


Ada*_*mAL 11

在 python 3 中,您可以将它们打包在一个列表中,对其进行过滤,然后使用*- 运算符将列表解压为以下参数search

color = request.GET.get ('color')
size = request.GET.get ('size')
args = [ arg for arg in [color, size] if arg ]
search(*args)
Run Code Online (Sandbox Code Playgroud)

但是请注意,如果color是 falsy 并且是 true,则您将使用 1 个参数作为 的值size进行调用,这可能是错误的,但原始问题没有提到在这种情况下所需的行为。searchsize

(死灵术,因为我正在寻找比我更好的解决方案,但发现了这个问题)