假设我想从AST树中获取我从某些源代码生成的所有变量的类型 - 我将如何去做?
例如,假设我的源代码中有i = 5
之类的内容。如何从抽象语法树中确定i
的类型是整数?
我尝试了type()
功能;但是,它在这种情况下不起作用。
答案 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的变量没有类型。 值有类型。
这就是动态类型的工作原理。