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

发布于 2021-01-29 16:30:58

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

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

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

没有参数的函数是:

apicall = search ()

只有颜色

apicall = search (color)

并带有颜色和尺寸

apicall = search (color, size)

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

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

关注者
0
被浏览
48
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    假设这是一个标准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方法。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看