2013-05-15 26 views
5

我有以下变量,用户可以通过表单提交(它们不是必需的,但可以这样做以过滤搜索)。Python - 只有在变量存在的情况下才传递参数

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

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

不带参数的功能是:

apicall = search() 

颜色只是它

apicall = search (color) 

,并用颜色和大小是

apicall = search (color, size) 

如果参数定义我想通过它的功能,但如果不是我不想通过它。

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

回答

6

假设这是一个标准的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作为默认参数非常常见,因此您可以使用第一种方式。如果你不能修改你调用的函数,并且你不知道它的默认参数是什么(或者它的默认参数是模块常量或者某些东西,但这很少),我只会使用包装器方法。

+0

是的,但如果我的一个变量没有被定义那么'apicall(颜色,大小)'会抛出一个错误,不是吗? – user1328021

+0

好的,谢谢......你写的是我如何设想完成的,但我一直认为必须有更高效的方法...... – user1328021

+0

@ user1328021假设这两行都执行:'color = request.GET .get('color')'和 'size = request.GET.get('size')',那么'color'和'size'都保证**定义**,尽管它们可能是None '。你认为这样做效率低下? –

0

当你定义你的方法时,如果你设置了一个默认参数,你可以指定参数或不参与。

def search(color=None, size=None): 
    pass 

然后,当您调用它时,您可以指定关键字参数,如您所选。这两个是有效的:

apicall = search(color=color) 
apicall = search(size=size) 
0

meybe你可以使用这样的事情:

try: 
    apicall = search (color, size) 
else: 
    apicall = search(color) 
+0

,不会工作...大小是无,但它仍然存在... –

相关问题