我将此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>
让我们看看作为功能调用的myFunction(1)
我不会非常明显地如何导航到上面的函数dec,同样函数dec应该包含它自己的子项?导航的方式不是很明显
我想我需要一些关于这个对象结构的rerefence手册或者如何遍历它的教程。现在最大的问题是我如何从_ast.Call
导航到_ast.FunctionDef