gpt4 book ai didi

python - 轻松为一行中的多个表达式生成 Python AST

转载 作者:太空狗 更新时间:2023-10-30 01:26:27 25 4
gpt4 key购买 nike

我想用 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 属性,使其成为单行表达式,但是有更简单的方法吗?

最佳答案

我假设您已经通过某种方法生成了 AST,而不是直接解析代码。一个简单的解决方案可能是

  1. 将全部或部分 AST 转换回一串 Python 代码
  2. 操纵那个字符串
  3. 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)]

关于python - 轻松为一行中的多个表达式生成 Python AST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46034134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com