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

如何获取通过exec在函数内部动态声明的Python函数源代码?

获取exec动态生成函数的源代码解决方案

当函数通过exec在第三方模块的函数内部动态声明时,inspect.getsource无法获取其源代码——这类动态函数没有关联的源文件信息,且生成它的func_code属于第三方内部逻辑,无法直接访问。

简化示例

from inspect import getsource

def declare_func():
    func_code = '''def new_func():
    print("Hello, world!")'''
    exec(func_code)
    return locals()['new_func']

func = declare_func()

print('=run=')
func()

print('=func=')
print(func)

print('=code=')
print(getsource(func))

运行输出

=run=
Hello, world!
=func=
<function new_func at 0x000001DF77173E20>
=code=
... OSError: could not get source code

解决方案

由于无法直接获取生成函数的原始字符串,只能通过反编译函数的字节码来还原源代码,推荐使用uncompyle6库:

  1. 安装依赖
pip install uncompyle6
  1. 编写获取源码的函数
import uncompyle6
from io import StringIO

def get_dynamic_func_source(func):
    output_buffer = StringIO()
    # 反编译函数的字节码
    uncompyle6.decompile(func.__code__, output_buffer)
    return output_buffer.getvalue()

# 调用示例
func = declare_func()
print(get_dynamic_func_source(func))

说明

  • 反编译得到的代码和原始代码可能存在细微格式差异(如空格、换行),但逻辑完全一致。
  • 如果不想安装第三方库,也可以用Python内置的dis模块查看字节码,但可读性远不如反编译后的源码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:05:12