Python 仅将非 None 的参数传递给函数

Posted

技术标签:

【中文标题】Python 仅将非 None 的参数传递给函数【英文标题】:Python pass only parameters which are not None to a function 【发布时间】:2021-11-03 04:35:04 【问题描述】:

我有一个函数有四个参数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 案例?

【问题讨论】:

myfunc2 是否将参数默认为 None 以外的参数?否则这不会有什么不同。 【参考方案1】:

您可以使用 dict comprehension 创建一个带有 not none 参数的字典,并通过解包将其传递给 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)

【讨论】:

【参考方案2】:
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)

【讨论】:

IMO 没用。如果 OP 具​​有默认为 None 的默认参数。而你的函数需要**kwargs,为什么有人会通过myfunc(a=2, b=None, c=None, d=3)这样的东西?问题的重点是 OP 会通过 myfunc(a=2, d=3) 为了明确我的观点,让我们假设 OP 会根据 None /default 变量设置一些变量。如果函数定义为myfunc(**kwargs),则它没有默认值。因此,解决方法是myfunc(a=1, b=None, c=None, d=2)。它不会破坏默认参数的目的吗? 这个问题给出了一个函数,其中所有默认值实际上都是 None。他不想传递任何无变量。所以默认值无论如何都不会传递给第二个函数。但我明白你的意思,这两个功能(他和我的)实际上是不同的。

以上是关于Python 仅将非 None 的参数传递给函数的主要内容,如果未能解决你的问题,请参考以下文章

将非标准评估参数传递给子集函数

c++ 函数:将非 const 参数传递给 const 引用参数

将非静态成员函数作为参数传递给另一个类中的成员函数

将关键字参数传递给 Python threading.Thread 中的目标函数

markdown 将非原始参数传递给Apex方法的问题

Firebase 动态链接将自定义参数传递给 iOS 和 android