You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:57:19