0

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

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']

以上结果表明class属性cl_attr返回了class属性。但是,当我尝试:

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

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

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

4

1 回答 1

0

symtable执行给它的代码,但它不会实例化你的 class A。所以它通过定义类A和它的方法来跟随解释器,但是方法的分析是静态的——方法实际上并没有被执行,因为类实际上并没有被实例化。另一种理解它的方式——symtable显示在将 Python 代码编译为字节码期间收集的信息。

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

于 2013-05-06T04:07:44.940 回答