2013-05-03 96 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