Python如何仅向被调函数传入非None参数,无需写全组合判断?
方案1:使用locals()快速过滤(最简实现)
在函数最开头获取所有局部变量(此时局部变量只有入参),过滤掉值为None的项后,直接拆包传入myfunc2即可:
def myfunc(a=None, b=None, c=None, d=None): # 必须在函数最开头调用locals(),避免后续新增的局部变量混入参数列表 valid_kwargs = {k: v for k, v in locals().items() if v is not None} myfunc2(**valid_kwargs)
注意:如果在调用
locals()前定义了其他局部变量,这些变量也会被纳入过滤范围,导致传参错误。
方案2:结合inspect模块稳定获取入参(推荐用于复杂函数)
如果函数内部后续会新增其他局部变量,可以通过inspect模块明确获取当前函数的入参名,只针对入参做过滤,稳定性更高:
import inspect def myfunc(a=None, b=None, c=None, d=None): # 获取当前函数的所有入参名列表 param_names = [p.name for p in inspect.signature(myfunc).parameters.values()] valid_kwargs = {name: locals()[name] for name in param_names if locals()[name] is not None} myfunc2(**valid_kwargs)
方案3:修改函数签名用**kwargs接收参数(扩展性最优)
如果允许调整myfunc的定义,直接用关键字参数接收所有传入值,不需要提前声明参数,后续增减参数也不用改过滤逻辑:
def myfunc(**kwargs): # 可选:如果需要限制仅允许传入a/b/c/d四个参数,加上以下校验 allowed_params = {"a", "b", "c", "d"} invalid_params = kwargs.keys() - allowed_params if invalid_params: raise TypeError(f"myfunc() received unexpected parameters: {', '.join(invalid_params)}") # 过滤掉值为None的参数(如果不需要可直接传**kwargs) valid_kwargs = {k: v for k, v in kwargs.items() if v is not None} myfunc2(**valid_kwargs)
内容的提问来源于stack exchange,提问作者S_S
相关产品推荐
相关产品推荐

