簡體   English   中英

在python程序中查找變量列表而無需顯式運行程序

[英]Finding a list of variables in python program without running the program explicitly

我需要在python程序中獲取所有變量,但不允許運行該程序。 但是,我可以通過從主程序調用它來運行它並分析局部變量。

ast是你的朋友。 它使您可以利用實際的Python解析器,但不能實際執行解析的代碼。

也就是說,這只會給您一階近似值-由於Python允許動態創建變量,因此靜態分析無法預測所有變量創建的100%。

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

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

假設path是從文件或用戶讀取的內容。 您可以指定執行此塊后將定義多少個變量嗎?

更病理的情況將是這樣的

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

這將創建一個局部變量x但是它使用賦值語句,因此您甚至無法使用ast模塊捕獲它。

如果我錯了,請指正我,但是我想說的是,使用AST可能會在這里造成太大的傷害。 變量不是出現在賦值語句的左側嗎?

編輯:這里這里閱讀手冊

似乎“變量”是可以綁定值的標識符的特定實例。 在Python執行模型的上下文中,這些稱為綁定到“名稱”的“對象”。

如果名稱綁定在塊中,則它是該塊的局部變量。 如果名稱在模塊級別綁定,則它是全局變量。 (模塊代碼塊的變量是局部變量和全局變量。)如果在代碼塊中使用了變量但未在其中定義,則該變量為自由變量。

這是最棒的東西(我的重點):

以下構造綁定名稱:函數的形式參數import語句, 類和函數定義 (這些綁定在定義塊中的類或函數名稱),以及目標(如果在賦值中出現的話,則是標識符)的目標, 用於第二個循環except子句標題的位置或在with語句之后。 ... import *形式的import語句綁定在導入模塊中定義的所有名稱,但下划線開頭的名稱除外。 該表格只能在模塊級別使用。

因此,如果您能夠涵蓋這些基礎,那就大功告成! :)

我假設您以此分析的任何代碼都將是基本的Python代碼; 否則,您可能需要按照上述建議使用AST。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM