2013-05-03 78 views
0

我正在开发一个插件,它是一种用于python代码的类浏览器。我发现python模块symtable有帮助。但是,这个模块似乎有一个缺点。我无法使用此模块获取实例属性。下面是在一个文件中的示例Python代码名为src.py关于python模块symtable

import os 

class A(): 
    cl_attr = 1 
    def fn1(self): 
     self.attr1 = 'hello' 
    def fn2(self, arg): 
     self.attr2 = arg 

然后在Python解释:

Python 2.7 (r27:82500, Jul 9 2010, 09:28:49) 
[GCC 4.1.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> src = open('src.py', 'r').read() 
>>> import symtable 
>>> table = symtable.symtable(src, 'src.py', 'exec') 
>>> table.get_children()[0].get_identifiers() 
['fn1', 'cl_attr', 'fn2'] 

上述结果表明,类属性cl_attr返回。但是,当我尝试:

>>> table.get_children()[0].get_children()[0].get_identifiers() 
['self'] 
>>> table.get_children()[0].get_children()[1].get_identifiers() 
['self', 'arg'] 

我只能获取实例方法的参数,而实例属性丢失。

因此,我想知道是否有办法获得实例属性。如果不是,我不得不求助于另一个python模块ast。任何人都可以帮助我吗?谢谢!

回答

0

symtable执行提供给它的代码,但它没有实例化你的类A。所以它遵循解释器通过定义类A,其方法,但方法的分析是静态 - 方法没有实际执行,因为该类没有实际实例化。理解它的另一种方式 - symtable将Python代码的编译收集的信息显示为字节码。

ast模块可能对您有所帮助,但在一般情况下也无济于事;因为Python是如此动态,所以新的属性可以在运行时添加到对象中,甚至可以通过用户输入构建它们的名称 - 使用symtableast等工具进行的静态分析无法发现所有此类方法。你需要用适当的钩子来运行代码来捕获你的信息。

+0

谢谢!这是相当丰富的。但是我认为对我来说,'ast'已经足够了。无论如何,再次感谢! – user2346069 2013-05-06 05:02:36

+0

@ user2346069:对于大多数实际使用情况,“ast”应该足够了 – 2013-05-06 12:09:58