2015-11-19 67 views
1

比方說,我有一個函數f:查找給定函數f的輸出中涉及的所有函數和類?

def f(): 
    ... 

有一個簡單的方法來找到參與f輸出所有功能(源代碼+路徑)和類(源代碼+路徑)?例如,如果f使用導入的函數g來計算其輸出,那麼我們能得到源碼g +它的路徑嗎?

也許蟒蛇astdis圖書館能夠做到這一點優雅?

回答

1

不,因爲該信息僅在執行f時可用。假設你有以下f

def f(x): 
    return x.text() 

是什麼類型x?什麼是text?誰知道! f不包含任何這些信息。


如果你實際上執行f,你可以找出哪些功能f依賴於特定的執行。例如,使用一個分析器,你可以做

import cProfile 
cProfile.runcall(f, x) 

剖析的f(x)執行,看看被調用。如果您需要更多信息,則可以基於profile模塊構建一些內容來收集數據。儘管如此,這仍然不會讓你知道什麼f會在你沒有測試的情況下調用。

+0

我們可以檢查'x',並獲得創建'x'的類定義,返回該類定義的源代碼行+路徑(這是您寫的'f'的理想答案)?即我們不能用'ast'這樣的東西來跳入'x'嗎? – applecider

+0

@applecider:不,因爲你沒有'x'。你可以通過分析執行一個使用'f'的程序來得到這種信息,但這需要你真正執行它。 – user2357112

+0

啊我明白了,我可以執行它,我們可以實現這樣的解決方案嗎?我想到的一件事就是一步一步的調試器,它可以讓你進入'x.text()',它會帶你到任何生成'x'類的'text'方法的源代碼。如果我們可以遞歸地做到這一點,並返回所有訪問過的源文件和文件路徑,那就是我認爲的解決方案。 – applecider