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

Python中inspect.getsource用于装饰器时抛出OSError问题解决

解决AST修改函数作为装饰器时的OSError问题

问题场景

现有函数:

def foo():
    for _ in range(1):
        print("hello")

我写了一个modify函数,通过AST解析、修改并重新编译函数,目的是给循环每次迭代后添加打印"Loop iterated"的语句。直接执行foo = modify(foo)后调用foo()完全正常,但用@modify装饰器修饰foo后调用foo(),会抛出OSError: could not get source code。而且只有返回修改后的新函数时才会触发这个错误,返回原函数就没问题。

解决方案

在modify函数处理AST的逻辑中,添加一行代码移除函数节点的装饰器列表:

ast_tree.body[0].decorator_list = []

原因说明

当使用装饰器模式时,生成的新函数对应的AST节点里还保留着原函数的@modify装饰器信息,这会导致后续Python尝试获取函数源码时出现冲突。移除这个装饰器列表后,新函数的AST结构就不再包含装饰器残留,自然就能正常获取源码、执行函数了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:02:43