2012-03-14 29 views
0

我需要獲取python程序中的所有變量,但我不允許運行該程序。然而,我可以通過從主程序調用它並分析局部變量來運行它。在python程序中查找變量列表而不顯式運行程序

+0

由於python的動態特性,你只能期待在這個任務中取得部分成功 – 2012-03-14 07:37:57

+0

請注意,在一般情況下,這是不可能的,因爲在Python中,可以動態創建「變量」,而不會在詞彙中出現源文件 – 2012-03-14 07:38:28

+0

您永遠不會完全確定,但作爲一個開始,您可以查看模塊並搜索未包含在類或函數定義中的類「」,「def 」和「 = 」 (所以不在類/函數定義中沒有縮進或縮進)。這是作業嗎? – Tadeck 2012-03-14 07:39:31

回答

4

ast是你的朋友。它允許您利用實際的Python解析器,但實際上並不執行解析的代碼。這就是說,這隻會給你一個一階的近似值 - 因爲Python允許動態創建變量,所以靜態分析不能預測所有變量創建的100%。

3

你不能這樣做。 Python程序中的變量取決於執行路徑。它們都是動態實例化的。例如。

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

而且我們假設path是從文件或用戶讀出的內容。你能指定在執行這個模塊後將定義多少個變量嗎?

更病態的情況下會是這樣的

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

這將創建一個局部變量x但它的使用賦值語句,所以你不能使用ast模塊連追它。

+0

但是,您可以確實從這樣的腳本/模塊/程序中提取變量列表。因此,您將得到一個變量名稱列表,但不保證它們都是該模塊中可訪問的變量,並且不保證它們在腳本的每個位置均已定義。所以「你不能這樣做」並不完全正確。 – Tadeck 2012-03-14 07:45:48

+0

有更多的情況會打破這種情況。我已經更新了我的答案。 – 2012-03-14 09:31:30

+0

+1對於那個棘手的東西,我沒有看到像來自Home Alone 2的壞人那樣來。 – 2012-03-14 10:03:47

1

如果我錯了,請糾正我,但我會說任何與AST的東西可能矯枉過正在這裏。不是任何出現在賦值語句左側的變量?

編輯:閱讀本手冊herehere

這似乎是「變量」是標識符的具體實例,該值可以綁定。在Python執行模型的上下文中,這些被稱爲「對象」,它們被綁定到「名稱」。

如果名稱被綁定在一個塊中,它是該塊的局部變量。 如果名稱在模塊級綁定,它是一個全局變量。 (模塊代碼塊的 變量是本地和全局變量。)如果在代碼塊中使用了一個 變量,但在那裏未定義,則該變量是一個免費的 變量。

下面是甜的東西(我的重點):

下面的構造可以綁定名稱:正式參數到功能, 進口語句,類和函數定義(這些綁定定義塊中的 類別或函數名稱)以及如果在分配中發生 標識符的目標,for循環表頭 的第二個位置除子句標題或之後在 聲明。來自...的表單的進口聲明import *綁定 在導入的模塊中定義的所有名稱,除了那些以 開頭的下劃線。該表格只能用於模塊級別。

所以,如果你可以覆蓋這些基地,你設置! :)

我假設你用這個分析的任何代碼都是相當簡陋的Python代碼;否則你可能想要如上所述的AST。

+0

不需要。檢查我的答案是否有特別的病理情況。 – 2012-03-14 09:33:31

+0

當然,但我認爲在他的情況下,他可以忽略「pathalogical」情況,例如,他使用返回變量引用列表的函數。無論如何,我知道這在很多語言中通常是一個困難或無法解決的問題;然而,如果您能夠充分約束域,那麼與最困難或無法解決的問題一樣,它變得幾乎微不足道。 – 2012-03-14 10:03:02

+0

同意。雖然,瞭解100%解決方案的不可能性是很好的。 – 2012-03-14 10:18:34