我想用Python AST重新创建这个表达式:
1 == 2; 1 >= 2
我可以使用以下AST结构实现此目的:
Module(
body=[
Expr(value=Compare(left=Num(n=1), ops=[Eq()], comparators=[Num(n=2)])),
Expr(value=Compare(left=Num(n=1), ops=[GtE()], comparators=[Num(n=2)]))
]
)
但是上面的AST结构对于单行中的2个表达式和2个表达式是相同的,每个表达式都在一个单独的行中。
我知道我可以手动计算和修改节点的col_offset
和lineno
属性,使其成为一个符号线表达式,但有更简单的方法吗?< / p>
答案 0 :(得分:1)
我假设您通过某种方法生成AST,而不是直接解析代码。
可能是一个简单的解决方案parse()
结果使用新的正确的行号和列偏移来获得新的有效等效AST。
例如,遍历完整的AST,对于每个body
,将其转换为python代码,用分号替换所有换行符,parse()
结果,并用结果替换原始主体。
修改:这是使用astunparse模块的简单演示:
from ast import *
from astunparse import *
a1 = parse("1 == 2\n1 >= 2")
print map(lambda x: (x.lineno, x.col_offset), a1.body) # [(1, 0), (2, 0)]
a2 = parse(unparse(a1).strip().replace('\n', ';'))
print map(lambda x: (x.lineno, x.col_offset), a2.body) # [(1, 0), (1, 9)]