我有以下变量,用户可以选择通过表单提交(它们不是必需的,但可以这样做以过滤搜索)。
color = request.GET.get ('color')
size = request.GET.get ('size')
现在我想将这些变量传递给一个函数,但前提是它们存在。如果它们不存在,我想只运行没有参数的函数。
没有参数的函数是:
apicall = search ()
只有颜色
apicall = search (color)
并且颜色和大小都是
apicall = search (color, size)
如果定义了参数,我想将它传递给函数,但如果不是,我不想传递它。
最有效的方法是什么? python是否有内置方法?
答案 0 :(得分: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)
这样,你只能在一个地方检查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
作为默认参数非常常见,因此您可以使用第一种方式。我只会使用包装器方法,如果你不能修改你正在调用的函数,你不知道它的默认参数是什么(或者它的默认参数是模块常量或其他东西,但这很少见。)
答案 1 :(得分:1)
就像我喜欢@HenryKeiter的solution一样,Python提供了一种更简便的方法来检查参数。实际上,有两种不同的解决方案。
search()
是一个独立函数,并且您想查看args,则可以使用inspect中的this solution模块。示例代码1
>>> import inspect
>>> print(inspect.getfullargspec(search))
ArgSpec(args=['size', 'color'], varargs=None, keywords=None, defaults=(None, None))
search()
是一个类的方法(我们将其称为Search
),那么您可以简单地使用内置的vars函数来查看所有类方法及其参数:示例代码2
>>> import Search
>>> print(vars(Search))
mappingproxy({'__init__': <function Search.__init__(self, size, color)>,
'search': <function Search.search(self, size, color)})
第二种方法的唯一警告是,尽管可以从技术上讲if 'size' in vars(Search)['search']: do something
,但它作为一种视觉检查工具比程序化工具更有用。它只是不会很强大。说if 'size' in inspect.getfullargspec(Search.search).args: do something
或for arg in inspect.getfullargsspec(Search.search).args: do something
答案 2 :(得分:0)
也许你可以使用这样的东西:
try:
apicall = search (color, size)
else:
apicall = search(color)
答案 3 :(得分:0)
在python 3中,您可以将它们打包到列表中,进行过滤,然后使用*
运算符将列表解压缩为search
的参数:
color = request.GET.get ('color')
size = request.GET.get ('size')
args = [ arg for arg in [color, size] if arg ]
search(*args)
但是请注意,如果color
是虚假的,而size
是真实的,则您将以1个参数为search
的值调用size
,这很可能是是错误的,但是最初的问题没有提到那种情况下的期望行为。
(因为我一直在寻找比我的解决方案更好的解决方案,但发现了这个问题)
答案 4 :(得分:-1)
当您定义方法时,如果设置了默认参数,则可以指定参数。
def search(color=None, size=None):
pass
然后,当您调用它时,您可以根据需要指定关键字参数。这两个都是有效的:
apicall = search(color=color)
apicall = search(size=size)