类型在python中使用AST、visitor模式流动

类型在python中使用AST、visitor模式流动,python,static-analysis,type-inference,abstract-syntax-tree,visitor-pattern,Python,Static Analysis,Type Inference,Abstract Syntax Tree,Visitor Pattern,我需要提取python代码的类型和依赖项流 例如:对于以下代码- x=1+2 y=x m=y.someFunc(“123”) 我想说: x是一个数字 y依赖于x(因此它也是一个数字) m依赖于y和“123”(因此依赖于数字和字符串),其类型为y.someFunc返回值,未知 我发现最好的选择可能是使用ast库解析代码,然后使用访问者模式遍历代码 有一个工具\实现可以做相同或类似的事情,我可以根据自己的需要进行调整 谢谢 你需要的不仅仅是AST。您必须知道哪个标识符是哪个,您需要知道控制流(y与x

我需要提取python代码的类型和依赖项流

例如:对于以下代码-

x=1+2

y=x

m=y.someFunc(“123”)

我想说:

x是一个数字

y依赖于x(因此它也是一个数字)

m依赖于y“123”(因此依赖于数字和字符串),其类型为y.someFunc返回值,未知

我发现最好的选择可能是使用ast库解析代码,然后使用访问者模式遍历代码

有一个工具\实现可以做相同或类似的事情,我可以根据自己的需要进行调整


谢谢

你需要的不仅仅是AST。您必须知道哪个标识符是哪个,您需要知道控制流(y与x不同,除非对x的赋值支配对y的赋值,没有其他对x的中间赋值),更一般地说,您需要执行某种基于对象的数据流。在你开始你的分析之前,需要有很多机制。它不应该是完美的,只是涵盖了大多数情况。我使用的是代码片段,而不是完整的程序,所以可能会更容易一些?实际上没有完美的静态分析;涉及图灵机器。所以你的答案要么是近似的,要么是保守的。如果您的代码片段足够大,甚至可以包含几个语句,那么您就几乎遇到了完整程序的所有问题:作用域、函数调用、条件、循环等等。。。[实际上,您在执行“赋值”、“加法”、“比较”和“循环”时会遇到图灵问题]。您的第一个问题应该是,“您能容忍多大程度的不准确,为什么?”请考虑以下代码段:begin;x=bar();if foo()那么x=baz();end;bar和baz返回不同的类型(这意味着我们必须知道它们有哪些类型,我们在这里讨论的是Python)。让我们考虑一下bar和baz可能会抛出异常的可能性。最后的x是什么类型?