Python如何通过字典映射调用多函数 无需if-else适配差异化入参
无if-else实现按输入值调度多函数的方案
最基础的实现逻辑是用字典做输入值和目标函数的映射,不需要写任何条件判断分支,基础写法示例:
def fun1(a, b, c): # 自定义函数逻辑 .... def fun2(): # 自定义函数逻辑 .... def fun3(): # 自定义函数逻辑 .... # 构建值到函数的映射表 func_map = { 1: fun1, 2: fun2, 3: fun3 } # 传入对应参数直接调用匹配到的函数 func_map[1](对应输入参数)
不同函数参数不一致的适配方法
如果映射表中的函数入参数量、形式不统一,也不需要加if-else分支区分传参,核心是把参数匹配逻辑和调度逻辑解耦,不在调度层做判断,两种可直接落地的方案如下:
- 提前绑定对应参数
用标准库的functools.partial提前把每个函数需要的参数绑定好,存在映射表中,调用时不需要额外传参,直接执行即可:from functools import partial func_map = { 1: partial(fun1, a=1, b=2, c=3), 2: partial(fun2), 3: partial(fun3, x="demo") } # 按输入值取出直接执行,无需处理参数 func_map[input_value]() - 统一参数入口,函数内部按需取值
给所有被调度的函数设置统一的入参格式(比如统一接收一个参数字典),每个函数内部自己提取需要的参数,不需要的参数直接忽略即可,调度时统一把全量参数传入:def fun1(params): a = params["a"] b = params["b"] c = params["c"] # fun1逻辑 def fun2(params): # fun2不需要参数,直接忽略传入的params即可 pass def fun3(params): x = params.get("x", "default") # fun3逻辑 func_map = {1: fun1, 2: fun2, 3: fun3} # 全量参数统一传入 all_params = {"a":1, "b":2, "c":3, "x":"demo"} func_map[input_value](all_params)
以上两种写法都完全规避了条件判断,后续新增、修改调度逻辑只需要维护映射表即可,不需要改动分支判断代码,可维护性远高于多层if-else的写法。
内容的提问来源于stack exchange,提问作者NELAPARTHI LIYANTH RAJU
相关产品推荐
相关产品推荐

