鉴于我有一个Python 3函数,如:
def foo(x: int) -> int:
y: int = x * x + 3
return x + y
从我可以访问foo
函数的其他模块中,我是否可以获得带注释的foo
AST?
我有几件我想做的事情,我认为带注释的“符号解析”树可以真正帮助我:
尝试各种代码分析。例如。尝试推断出函数的返回类型。或者函数的运行时复杂性,考虑到它使用的函数的运行时复杂性。或者甚至该功能是否是引用透明的。等
将带注释的Python子集翻译成不同的语言。例如,上面的函数foo
对C有一个非常自然的转换。它不完美(例如Python int有许多与C int非常不同的属性),但我想试验看看如何我可以推动它,看看是否有空间进行有趣的应用。
int foo(int x) {
int y = x * x + 3;
return x + y;
}
注意:我可能错了,但对于上面的两个应用程序,我不认为简单地解析原始函数会得到我需要的一切。如果我试图使用的函数使用的名称不在解析范围内的函数,我将被卡住。我需要使用块中的第一个赋值或对该函数关闭的作用域的引用来注释“Name”节点,以便我可以直接访问所引用的值。至少通过这种方式,我可以检查用于更复杂分析的值。