Python 迭代AST

Python 迭代AST,python,abstract-syntax-tree,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 这是因为我的脚本准备器对于上述用例来说太笨了,fil

我以这个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")
def myFunction(x, indexer):
    return filters.delta(x, indexer)


if starting:
    diagnostics.debug(myFunction(1, "1"))
    diagnostics.debug(myFunction(2, "2"))
这将导致使用相同的索引器对
myFunction
进行两次调用,第二次调用将覆盖第一次调用的样本。因此,我的目标是使用AST模块解析synstax树,并将索引器添加到链中的所有函数中。结果应该是这样的

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


if starting:
    diagnostics.debug(myFunction(1, "1"))
    diagnostics.debug(myFunction(2, "2"))
使用ast modele,我可以将脚本转储到类似

import ast
tree = ast.parse(script)
但是我还没有找到关于如何迭代树的任何信息,当我找到像
filters.delta
这样需要preparse的函数时,我将迭代备份并将参数添加到所有函数调用中。这有可能吗

下面是一个真实世界的例子,说明这个软件的用途

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
上面的代码将像我的另一个示例一样失败,因为
过滤器。连续旋转
将在
轴上索引

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

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

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

myFunction(1)
如果我通过ast.parse发送该脚本,我会得到类型为
\u ast.Module
的对象,第一级似乎很简单,它包含两个项目的列表:函数def和表达式
myFunction(1)

让我们看看函数调用的expr
myFunction(1)

我将如何导航到上面的函数dec并不十分明显,而且函数dec应该包含它自己的子函数?不太清楚它是如何导航的


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

这是一个相当广泛的问题;您是否看到
ast
模块有一个示例?它基于泛型,允许您根据图形遍历动态重写AST。因此,简短的答案是:是的,但长的答案是:你需要多少时间来反复讨论转换的细节,我真的没有那么多时间。你是
android[0]。偏航
俯仰
数字吗?将它们包装到一个像数字一样的自定义对象中,并包含索引器,怎么样?始终对值类型进行装箱和取消装箱将非常昂贵。preparser步骤可能是最好的解决方案。@Martijn,理想的解决方案是,如果我能将其转换为对象树结构,并将其传递到底层c#引擎,然后在那里进行解析(我使用的是iron python,主机是.NET应用程序)@Anders:the给了你这个;有问题的代码的Python对象树。