Python函数内使用exec实现动态累加逻辑未生效的问题解决
Python函数内使用exec实现动态逻辑的常见坑与解决方法
因为参与开发的项目复杂度较高,需要适配更灵活的动态代码逻辑,计划借助exec实现多行代码的压缩整合,为了方便定位问题、复现异常,专门使用最简化的三数求和场景做演示。
最常规的三数求和实现逻辑非常简洁:
def sum3(a, b, c): return a + b + c
初版尝试的问题
最初尝试把动态累加逻辑通过exec实现,写出的第一版代码存在明显的结构错误:
def suma_eval(a, b, c): suma = 0 for item in ("a", "b", "c"): exec(f'''suma+={item}''') print(f"""suma+={item}""") return suma
这版代码首先存在缩进不规范的语法问题,无法正常启动运行。
修正语法后的异常表现
按照提示把缩进调整正确、消除所有语法报错后,代码可以正常走完整个执行流程,但最终返回的累加结果始终为0,和预期的正确计算结果存在明显偏差。
出现这个问题的核心原因是:Python对函数内部的exec做了作用域限制,循环场景下exec对局部变量的修改无法同步回函数自身的局部变量栈,导致变量suma从始至终都保持初始赋值的0值,所有exec里的累加操作都没有真正作用到返回值上。
最终可正常运行的实现方式
调整exec的参数传入逻辑,手动指定exec执行时使用的全局命名空间、局部命名空间字典,每一次exec执行完成后,从局部命名空间字典中取出更新后的suma值,赋值给函数的实际变量,即可绕开上述作用域限制,得到正确的计算结果:
def suma_eval(a, b, c): suma = 0 ldict = {} for item in ("a", "b", "c"): exec(f'''suma+={item}''', locals(), ldict) suma = ldict["suma"] return suma
内容的提问来源于stack exchange,提问作者FARS
相关产品推荐
相关产品推荐

