Python3中模拟Python2 exec行为:解决UnboundLocalError问题
解决Python3中exec无法注入局部变量的问题
问题原因
Python2里exec会直接修改函数的局部命名空间,但Python3对函数局部变量的处理做了优化——局部变量在编译阶段就已确定,exec无法动态向函数局部作用域添加新变量。你在exec里定义的ec,后续会被当作未赋值的局部变量,从而触发UnboundLocalError。
解决方案
方案1:用getattr替代exec(推荐)
动态调用对象方法的场景,完全可以用Python标准的getattr实现,比exec更安全、易读且维护性更强:
def function_with_exec(table): sess, tgt = 3, None try: # 动态获取目标方法 count_method = getattr(some_object, f"{table}_get_entry_count") ec = count_method(sess_hdl=sess, dev_tgt=tgt) except AttributeError: return [] ec = some_function(ec) # 后续逻辑...
方案2:自定义命名空间字典(必须保留exec时使用)
如果因特殊原因必须使用exec,可以传入自定义的字典作为exec的局部命名空间,执行后从字典中取出变量:
def function_with_exec(table): sess, tgt = 3, None # 准备exec需要访问的变量,存入自定义字典 exec_locals = { 'sess': sess, 'tgt': tgt, 'some_object': some_object } try: exec(f"ec = some_object.{table}_get_entry_count(sess_hdl=sess, dev_tgt=tgt)", globals(), exec_locals) except AttributeError: return [] # 从自定义字典中取出ec的值 ec = exec_locals['ec'] ec = some_function(ec) # 后续逻辑...
需要把exec用到的所有变量(比如sess、tgt、some_object)都提前放入exec_locals,确保exec内部能正常访问。
内容的提问来源于stack exchange,提问作者edgarstack
相关产品推荐
相关产品推荐

