在一行中轻松生成多个表达式的Python AST

时间:2017-09-04 09:29:41

标签: python abstract-syntax-tree

我想用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_offsetlineno属性,使其成为一个符号线表达式,但有更简单的方法吗?< / p>

1 个答案:

答案 0 :(得分:1)

我假设您通过某种方法生成AST,而不是直接解析代码。

可能是一个简单的解决方案
  1. 将全部或部分AST转换回一串python代码
  2. 操纵该字符串
  3. parse()结果
  4. 使用新的正确的行号和列偏移来获得新的有效等效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)]