在python程序中查找变量列表而不显式运行程序

时间:2012-03-14 07:35:45

标签: python variables

我需要在python程序中获取所有变量,但我不允许运行该程序。但是,我可以通过从主程序调用它来运行它并分析局部变量。

3 个答案:

答案 0 :(得分:4)

ast是你的朋友。它允许您利用实际的Python解析器,但实际上并不执行解析的代码。

也就是说,这只会给你一阶近似 - 因为Python允许动态创建变量,静态分析无法预测所有变量创建的100%。

答案 1 :(得分:3)

你不能这样做。 Python程序中的变量取决于执行路径。它们都是动态实例化的。例如。

if path == 0:
   x = 1
else:
   z = 1
   w = 2

让我们说path是从文件或用户读出的东西。你能指定执行这个块后定义的变量数量吗?

更具病态的情况就是这样

if path == 0:
   locals()['x'] = 1

这将创建一个局部变量x,但它使用赋值语句,因此您甚至无法使用ast模块捕获它。

答案 2 :(得分:1)

如果我错了,请纠正我,但我会说任何有AST的事情都可能在这里过度杀伤。不是任何出现在赋值语句左侧的变量吗?

修改:阅读手册herehere

似乎“变量”是可以绑定值的标识符的特定实例。在Python执行模型的上下文中,这些被称为“对象”,它们被绑定到“名称”。

  

如果名称绑定在块中,则它是该块的局部变量。   如果名称在模块级别绑定,则它是全局变量。 (该   模块代码块的变量是本地的和全局的。)如果是   变量在代码块中使用但在那里没有定义,它是免费的   变量

这是甜蜜的东西(我的重点):

  

以下构造将名称:形式参数绑定到函数,   导入语句,类和函数定义(这些绑定   定义块中的类或函数名称)和目标   标识符出现在分配 for loop 标题中   除了子句标题的第二个位置,或者在 with 之后的第二个位置   声明。来自... import *的表单的import语句绑定   导入模块中定义的所有名称,除了那些以   一个下划线。此表单只能在模块级别使用。

所以,如果你可以覆盖这些基础,你就定了! :)

我认为你用这个分析的任何代码都是相当基本的Python代码;否则你可能想要按照上面的建议选择AST。