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
相关产品推荐
相关产品推荐

