1
比方說,我有一個函數f:查找給定函數f的輸出中涉及的所有函數和類?
def f():
...
有一個簡單的方法來找到參與f
輸出所有功能(源代碼+路徑)和類(源代碼+路徑)?例如,如果f
使用導入的函數g
來計算其輸出,那麼我們能得到源碼g
+它的路徑嗎?
也許蟒蛇ast
或dis
圖書館能夠做到這一點優雅?
比方說,我有一個函數f:查找給定函數f的輸出中涉及的所有函數和類?
def f():
...
有一個簡單的方法來找到參與f
輸出所有功能(源代碼+路徑)和類(源代碼+路徑)?例如,如果f
使用導入的函數g
來計算其輸出,那麼我們能得到源碼g
+它的路徑嗎?
也許蟒蛇ast
或dis
圖書館能夠做到這一點優雅?
不,因爲該信息僅在執行f
時可用。假設你有以下f
:
def f(x):
return x.text()
是什麼類型x
?什麼是text
?誰知道! f
不包含任何這些信息。
如果你實際上執行f
,你可以找出哪些功能f
依賴於特定的執行。例如,使用一個分析器,你可以做
import cProfile
cProfile.runcall(f, x)
剖析的f(x)
執行,看看被調用。如果您需要更多信息,則可以基於profile
模塊構建一些內容來收集數據。儘管如此,這仍然不會讓你知道什麼f
會在你沒有測試的情況下調用。
我們可以檢查'x',並獲得創建'x'的類定義,返回該類定義的源代碼行+路徑(這是您寫的'f'的理想答案)?即我們不能用'ast'這樣的東西來跳入'x'嗎? – applecider
@applecider:不,因爲你沒有'x'。你可以通過分析執行一個使用'f'的程序來得到這種信息,但這需要你真正執行它。 – user2357112
啊我明白了,我可以執行它,我們可以實現這樣的解決方案嗎?我想到的一件事就是一步一步的調試器,它可以讓你進入'x.text()',它會帶你到任何生成'x'類的'text'方法的源代碼。如果我們可以遞歸地做到這一點,並返回所有訪問過的源文件和文件路徑,那就是我認爲的解決方案。 – applecider