我正在开发一个插件,它是python代码的类浏览器。我发现python模块 symtable 很有帮助。但是,该模块似乎有一个缺点。我无法使用此模块获取实例属性。这是一个名为 src.py 的文件中的示例python代码:
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 :(得分:0)
symtable
执行给定的代码,但不会实例化您的类A
。因此它遵循解释器通过使用其方法定义类A
,但方法的分析是 static - 方法实际上没有执行,因为类实际上没有实例化。理解它的另一种方法 - symtable
将在Python代码的编译期间收集的信息显示为字节码。
ast
模块可能会对您有所帮助,但在一般情况下也无济于事;因为Python非常动态,所以可以在运行时将新属性添加到对象中,甚至可以根据用户输入构建名称 - 使用symtable
和ast
等工具进行静态分析无法发现所有此类方法。您需要使用适当的钩子实际运行代码以捕获您的信息。