【问题标题】:Python pass only parameters which are not None to a functionPython 仅将非 None 的参数传递给函数
【发布时间】: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 以外的参数?否则这不会有什么不同。

标签: python user-defined-functions nonetype


【解决方案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。他不想传递任何无变量。所以默认值无论如何都不会传递给第二个函数。但我明白你的意思,这两个功能(他和我的)实际上是不同的。
    猜你喜欢
    • 2015-01-23
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    相关资源
    最近更新 更多