Python 仅将非 None 的参数传递给函数
Posted
技术标签:
【中文标题】Python 仅将非 None 的参数传递给函数【英文标题】:Python pass only parameters which are not None to a function 【发布时间】:2021-11-03 04:35:04 【问题描述】:我有一个函数有四个参数a
、b
、c
和d
,如下图所示。
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
中传递a
和d
的值,那么我需要调用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 引用参数