Python无需if语句根据用户输入执行对应函数的实现方法
两种无if-else的实现方案
方案1:函数映射字典(最安全,生产环境推荐)
这是最推荐的实现方式,优点如下:
- 可精确控制允许被调用的函数,避免恶意/误调用其他全局函数
- 执行效率高,直接字典O(1)查询,无额外性能损耗
- 维护成本低,新增函数只需要在映射字典里加一条键值对即可
实现代码如下:
def function1(a,b): return a+b def function2(a,b): return a-b # 提前定义所有允许被调用的函数字典,key为函数字符串名,value为函数本身 func_map = { "function1": function1, "function2": function2, # 后续新增函数只需要按照这个格式加一行即可 # "function45": function45 } class marks: def __init__(self,w,b): self.w=w self.b=b def execute(self, func_name): if func_name not in func_map: print(f"错误:不存在名为{func_name}的可执行函数") return # 传入实例的w和b作为参数调用对应函数 res = func_map[func_name](self.w, self.b) print(res) m=marks(50,30) m.execute("function2") # 输出20 m.execute("function1") # 输出80
方案2:全局命名空间查找(适合小型自用项目)
如果不想手动维护映射字典,可以直接从全局命名空间查找函数,优点是不用额外维护映射关系,缺点是存在安全风险,只要全局存在同名函数都会被执行,不适合生产环境或者对外提供服务的项目。
execute方法实现如下:
def execute(self, func_name): # 从全局命名空间获取对应名称的对象 target_func = globals().get(func_name) # 校验是否为可调用的函数 if not callable(target_func): print(f"错误:{func_name}不是可执行的函数") return res = target_func(self.w, self.b) print(res)
注意事项
- 绝对不要直接使用
eval执行输入的字符串,会存在严重的代码注入风险 - 如果需要适配参数不固定的函数,可以在execute方法中加入可变参数
*args、**kwargs做适配
内容的提问来源于stack exchange,提问作者Akila Uyanwatta
相关产品推荐
相关产品推荐

