Python中如何按条件为函数的可选参数传值?
可以实现,Python 没有你举例的 foo(a1_string?, a2_string?) 原生语法,但可以用字典推导加关键字参数解包的单行写法实现完全等价的逻辑:
foo(**{k: v for k, v in {"arg1": a1_string, "arg2": a2_string}.items() if v})
原理解释
- 首先构造临时字典,字典的键和函数
foo的参数名一一对应,值为你要传入的对应变量 - 通过字典推导过滤掉值为空/假值的键值对,仅保留有有效值的参数项
- 用
**运算符将过滤后的字典解包为关键字参数传入函数,未被传入的参数会自动使用函数定义的默认值,效果和你写的多分支判断完全一致
自定义空值判断规则
如果你对“空值”的定义和Python默认的真值判断规则不同(比如你认为0、False属于有效值,仅None才算空),只需要修改推导式的过滤条件即可:
# 仅过滤值为None的参数 foo(**{k: v for k, v in {"arg1": a1_string, "arg2": a2_string}.items() if v is not None})
扩展性优势
相比你原本的多分支写法,该方案扩展性更强:如果后续函数新增了带默认值的参数,只需要在临时字典里添加对应的键值对即可,不需要额外新增分支判断。
内容的提问来源于stack exchange,提问作者Flyn Sequeira
相关产品推荐
相关产品推荐

