如何从Python的AST中获取变量的类型?

时间:2011-12-08 02:23:23

标签: python types abstract-syntax-tree

假设我想从AST树中获取我从某些源代码生成的所有变量的类型 - 我将如何去做? 例如,假设我的源代码中有i = 5之类的内容。如何从抽象语法树中确定i的类型是整数?

我尝试了type()功能;但是,它在这种情况下不起作用。

3 个答案:

答案 0 :(得分:3)

正如其他帖子中所解释的那样,如果不对语法树进行大量分析,就没有简单的方法来实现这一点,因为python ast模块没有提供任何功能。

您仍然可以使用logilab的ast 1,它是pylint 2的基础,并提供静态推理功能。

这是一个简单的例子:

from logilab.astng.builder import ASTNGBuilder
builder = ASTNGBuilder()
astng = builder.string_build('i = 1', __name__, '<string>')
assnode = astng['']
print [(inf.value, type(inf.value)) for inf in assnode.infer()]

当然,你必须挖掘api以获得更真实的用法。您仍然可以编写python-projects@lists.logilab.org以获取相关帮助。

答案 1 :(得分:2)

正如其他海报所指出的那样,动态类型语言并不容易。您不能像在C或Java中那样将赋值跟踪回静态类型声明。

然而,人们通常可以合理地确定类型。

据推测,范围规则允许人们确定在询问问题的地方(“代码中此点的类型是什么?”)中可以访问/更新/绑定哪个i(或哪一组i)。然后可以对可能分配的所有值进行分析(特别简单的情况是当i仅绑定到函数定义时)。这些类型的类型点阵的上界是i的“类型”。是的,在某些情况下它可能是“任何东西”,但在大多数编写良好的程序中,即使动态变量具有程序员想要的“窄”类型,并且通常是原始语言类型(例如,呃,“int”)。或者程序员无法合理地编写算法(什么,你的数组索引有时不是整数?)。

您需要对程序进行某种保守分析以确定此上限类型。 (显然,您可以进行简单的分析,并断定变量可以是“任何”类型无用)。我认为这是一个令人不满意的答案。

进行所有这些分析的机制非常复杂(你需要进行全局流分析,并确定可以动态加载什么才能做到这一点)并且我怀疑Python的AST包是否能做到这一点。

答案 2 :(得分:0)

你不能,因为Python的变量没有类型。 有类型。

这就是动态类型的工作原理。