通过meta包以编程方式转换python代码

时间:2016-01-18 06:34:46

标签: python abstract-syntax-tree

我想转换所有出现的" some_func(a,b)"在python模块中,#34;断言a == b"。我尝试使用meta包:

import meta, ast

source = '''
assert_equal(a, b)
'''
orig = ast.parse(source, '<nofile>', 'exec')

assert_ast = ast.parse('assert a == b')
assert_ast.body[0].test.left = orig.body[0].value.args[0]
assert_ast.body[0].test.comparators[0] = orig.body[0].value.args[1]

code = compile(assert_ast, '<nofile>', 'exec')
mod2 = meta.decompile(code)
source2 = meta.dump_python_source(mod2)

print(source2)

这打印&#34;((a == b)或引发AssertionError)&#34;,不是我所期待的,但确实在语义上等同于我想要的。我可以将一个正则表达式子应用于&#34;修复&#34;这样:

source3 = re.sub(r"\(\((.*)\) or raise AssertionError\)", r"assert \1", source2)
print(source3)

到目前为止,我应该可以使用NodeTransformer将其应用于所有出现的some_func。但是我想知道是否有办法修复上述基于元的方法,以便我不必使用任何正则表达式后处理?

0 个答案:

没有答案