Python传递参数时,只向函数传递非None的参数。

8
我有一个带有四个参数abcd的函数,如下所示。
def myfunc(a=None,b=None,c=None,d=None):
    
    if <check which are not None>:
        myfunc2(<pass those which are not None>)

我需要在这个函数内部调用另一个名为myfunc2的函数,但只使用用户在myfunc中传递的参数。例如,如果用户在myfunc中为ad传递了值,则我需要按如下方式调用myfunc2

myfunc2(a=a, d=d)

除了编写所有可能的a,b,c,d组合的if语句外,是否有简单的方法可以完成此操作?


3
myfunc2是否将参数的默认值设为了除None以外的其他值?否则这句话就没有意义。 - Jason S
2个回答

13
你可以使用字典推导式来创建一个只包含非空参数的字典,并通过解包将其传递给myfunc2
def myfunc(a=None,b=None,c=None,d=None):
    params = {
        "a": a,
        "b": b,
        "c": c,
        "d": d,
    }

    not_none_params = {k:v for k, v in params.items() if v is not None}
    myfunc2(**not_none_params)

5
def myfunc(**kwargs):
    myfunc2(**{k:v for k, v in kwargs.items() if v is not None})

如需保持函数的调用签名,并使用指定的4个默认参数,可以这样操作:

def myfunc(a=None, b=None, c=None, d=None):
    def f(**kwargs):
        return myfunc2(**{k:v for k, v in kwargs.items() if v is not None})
    return f(a=a, b=b, c=c, d=d)

1
在我看来没有用。如果 OP 有默认参数,默认为 None。而你的函数接受 **kwargs,为什么会有人传递这样的内容 myfunc(a=2, b=None, c=None, d=3)??问题的重点是 OP 只需要传递 myfunc(a=2, d=3) - Ch3steR
为了让我的观点更清晰,假设 OP 根据 None / 默认变量设置一些变量。如果函数定义是 myfunc(**kwargs),那么它没有默认值。因此,解决方法是 myfunc(a=1, b=None, c=None, d=2)。这难道不是违背默认参数的目的吗? - Ch3steR
这个问题给出了一个函数,其中所有默认值实际上都是None。他不想传递任何变量为None。因此,默认值将不会被传递到第二个函数中。但我明白你的意思,他和我的两个函数实际上是不同的。 - Paul Cornelius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接