迭代AST

时间:2015-06-06 12:19:08

标签: python abstract-syntax-tree

我将此python代码作为示例

def myFunction(x):
    return filters.delta(x)


if starting:
    diagnostics.debug(myFunction(1))
    diagnostics.debug(myFunction(2))

filters.delta是一个util函数,我的应用程序的用户可以在他们的python脚本中使用上面代码输出

0
0

但它输出

0
1

这是因为我的脚本预处理器对于上面的用例来说太愚蠢了,filter.delta函数的真实参数是filters.delta(x, indexer)我的哑预备器只是添加了参数的名称。因此,在预填充后,上面的代码看起来像

def myFunction(x):
    return filters.delta(x, "x")

这将导致使用相同索引器调用myFunction,第二次调用将覆盖第一次调用的样本。所以我的目标是使用AST模块解析synstax树并将索引器添加到链中的所有函数。结果应该看起来像

def myFunction(x, indexer):
    return filters.delta(x, indexer)


if starting:
    diagnostics.debug(myFunction(1, "1"))
    diagnostics.debug(myFunction(2, "2"))

使用ast模型我可以将脚本转储到像

这样的树
import ast
tree = ast.parse(script)

但是我没有找到关于如何迭代树的任何信息,当我找到需要预编译的filters.delta函数时,我将迭代备份并将参数添加到所有函数调用。这有可能吗?

以下是该软件用于

的真实示例
def filterAndroidSignal(axis):
    return filters.deadband(filters.continuousRotation(axis), 0.1)


def onUpdate():
    vJoy[0].x = filterAndroidSignal(android[0].yaw)
    vJoy[0].y = filterAndroidSignal(android[0].pitch)

if starting:
    android[0].update += onUpdate

上面的代码会像我的其他示例一样失败,因为filters.continuousRotation会在"axis"上编入索引

我们正在做所有这一切,因为我们的目标用户不是程序员,他们是游戏玩家和VR爱好者,我们想要一个简单的剪裁机制。

http://andersmalmgren.github.io/FreePIE/

更新: 我将测试脚本简化为此

def myFunction(x):
    return filters.delta(x)

myFunction(1)

如果我通过ast.parse发送该脚本,我得到类型_ast.Module的对象第一级看起来很直接,它包含两个项目的列表,函数def和表达式myFunction(1) < / p>

enter image description here

让我们看看作为功能调用的myFunction(1)

的expr

enter image description here

我不会非常明显地如何导航到上面的函数dec,同样函数dec应该包含它自己的子项?导航的方式不是很明显

enter image description here

我想我需要一些关于这个对象结构的rerefence手册或者如何遍历它的教程。现在最大的问题是我如何从_ast.Call导航到_ast.FunctionDef

0 个答案:

没有答案