【发布时间】:2019-12-20 03:58:05
【问题描述】:
我有一个想法来转换所有使用类似于下面的装饰器标记的给定函数,
@transform_ast
def foo(x):
return x
在transform_ast 中,我获取源代码,提取 ast,对其进行转换,然后再次从中创建代码对象和函数类型。它看起来像下面,
import ast
import inspect
import types
class Rewrite(ast.NodeTransformer):
pass
def transform_ast(f):
source = inspect.getsource(f)
source = '\n'.join(source.splitlines()[1:]) # remove the decorator first line.
print(source)
old_code_obj = f.__code__
old_ast = ast.parse(source)
new_ast = Rewrite().visit(old_ast)
new_code_obj = compile(new_ast, old_code_obj.co_filename, 'exec')
new_f = types.FunctionType(new_code_obj, {})
return new_f
@transform_ast
def foo(x):
return x
但是,当我随后调用 foo(x) 时,它似乎无法正常工作。
出于所有实际目的,我们可以假设我的转换只是将return x 重写为return x+1。理想情况下,我希望一切都能正常工作,包括能够使用调试器进入函数...
调用foo(10),会报如下错误,
TypeError: module() 不接受任何参数(给定 1 个)
我做错了什么吗?
【问题讨论】:
标签: python abstract-syntax-tree python-decorators