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

如何让动态生成的函数访问其他作用域变量并执行?

解决方案

问题1:将目标帧的f_locals和f_globals注入当前帧

Python里当前执行帧的本地作用域(locals)是只读的,直接修改locals()不会影响当前作用域的变量查找。你可以通过以下方式将目标帧的变量导入当前作用域:

  • 合并变量到全局作用域:
import inspect

# 假设已通过inspect.stack()拿到目标帧target_frame
target_frame = inspect.stack()[1][0]  # 示例:取调用者的帧

# 合并目标帧的全局变量到当前全局作用域
globals().update(target_frame.f_globals)
# 将目标帧的本地变量导入当前全局作用域
for k, v in target_frame.f_locals.items():
    globals()[k] = v

# 此时执行动态函数即可访问x
dynamically_generated_function()
  • 用exec在局部加载变量(避免污染全局作用域):
import inspect

target_frame = inspect.stack()[1][0]
# 合并目标帧的命名空间,执行函数
exec("dynamically_generated_function()", {**target_frame.f_globals, **target_frame.f_locals})

问题2:在定义x的目标帧中执行动态函数

可以通过重新绑定函数的命名空间,或者直接在目标帧上下文中执行函数:

  • 方式1:修改函数的__globals__属性
import inspect
import types

target_frame = inspect.stack()[1][0]

# 合并原函数全局空间与目标帧的变量
new_globals = {**dynamically_generated_function.__globals__, 
               **target_frame.f_globals, 
               **target_frame.f_locals}
# 创建绑定了新命名空间的函数实例
bound_func = types.FunctionType(dynamically_generated_function.__code__, new_globals)
# 执行函数
bound_func()
  • 方式2:直接在目标帧的命名空间中执行函数代码
import inspect

target_frame = inspect.stack()[1][0]
# 传入目标帧的globals和locals作为执行环境
exec(dynamically_generated_function.__code__, target_frame.f_globals, target_frame.f_locals)

注意事项

  • 操作帧对象属于Python底层特性,不同版本可能存在兼容性问题,生产环境需谨慎使用。
  • 直接修改作用域或函数命名空间可能引发变量覆盖、意外副作用,需仔细处理。

内容的提问来源于stack exchange,提问作者Grzegorz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:25:32