Python — Only pass arguments if the variable exists
我有以下变量,用户可以选择通过表单提交(它们不是必需的,但可以这样做以过滤搜索)。
1 2 | color = request.GET.get ('color') size = request.GET.get ('size') |
现在我想将这些变量传递给一个函数,但前提是它们存在。 如果它们不存在,我想只运行没有参数的函数。
没有参数的函数是:
1 | apicall = search () |
只有它的颜色
1 | apicall = search (color) |
它的颜色和大小
1 | apicall = search (color, size) |
如果定义了参数,我想将它传递给函数,但如果不是,我不想传递它。
最有效的方法是什么? python有内置的方法吗?
假设这是一个标准的
1 2 3 4 5 6 | def apicall(color=None, size=None): pass # Do stuff color = request.GET.get('color') size = request.GET.get('size') apicall(color, size) |
这样,您只在一个地方检查
最后,我注意到你的函数名是
1 2 3 4 5 6 7 8 9 10 11 12 | 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) |
注意:除非您看不到您正在调用的代码并且没有任何文档,否则不需要第二个版本!使用
尽管我喜欢@HenryKeiter的解决方案,Python提供了一种更简单的方法来检查参数。事实上,有几种不同的解决方案。
示例代码1
1 2 3 4 | >>> import inspect >>> print(inspect.getfullargspec(search)) ArgSpec(args=['size', 'color'], varargs=None, keywords=None, defaults=(None, None)) |
示例代码2
1 2 3 4 5 | >>> import Search >>> print(vars(Search)) mappingproxy({'__init__': <function Search.__init__(self, size, color)>, 'search': <function Search.search(self, size, color)}) |
第二种方法唯一需要注意的是,它作为视觉检测工具更有用,而不是程序化工具,尽管技术上可以说
在python 3中,您可以将它们打包在列表中,对其进行过滤,然后使用
1 2 3 4 | color = request.GET.get ('color') size = request.GET.get ('size') args = [ arg for arg in [color, size] if arg ] search(*args) |
但请注意,如果
(因为我正在寻找比我更好的解决方案,但发现了这个问题)
meybe你可以使用这样的东西:
1 2 3 4 | try: apicall = search (color, size) else: apicall = search(color) |
在定义方法时,如果设置了默认参数,则可以指定参数。
1 2 | def search(color=None, size=None): pass |
然后,当您调用它时,您可以根据需要指定关键字参数。这两个都是有效的:
1 2 | apicall = search(color=color) apicall = search(size=size) |