2013-04-16 27 views
0

找到函數所有函數調用的最佳方法是什麼?我想在運行時做到這一點(可能與裝飾)。通過函數查找所有函數調用

是用inspect(這意味着我將不得不訪問源代碼...所以沒有交互式解釋器支持)檢索源代碼的最佳方式,然後用ast解析它?有沒有更好的辦法?

Python 2.7首選,但不是必需的。我希望它足夠簡單,可以做我自己。如果其他人已經做到了,我會查看源代碼,以便我能夠弄清楚。最終,我只會對某個特定裝飾器的函數調用感興趣,但是對於這個部分已經有了答案。

編輯:

def f(): 
    return g(1) 


@Interesting 
def g(x): 
    return x + 1 

print what_interesting_functions_does_this_call(f) 

打印

(<function g at 0x7f2a1ec72a28>,) 

我現在意識到,因爲這Python的動態是,這是不可能在一般情況下。但是,我能否涵蓋一些案例子集? 「你是一個白癡,你爲什麼會想到能夠告訴另一個函數調用了哪些函數,我想不出爲什麼這個函數會有用,因此它不能是有用的對你有用「是一個好的迴應。我想知道。

+1

你可以用添加一個例子功能和預期的輸出?你想計算它調用每個函數的次數嗎? – shx2

+0

定義函數調用?你是否包括內建的?或只是你的功能? –

+0

只是我的功能。如果他們「有趣」,我會對他們進行註釋。 –

回答

0
>>> def a(): 
... float("1.2") 
... int("1") 
... b() 
... 
>>> def b(): 
... sum([1,2,3]) 
... 
>>> a() 
>>> import dis 
>>> dis 
<module 'dis' from 'C:\Python26\lib\dis.pyc'> 
>>> dis.dis(a) 
    2   0 LOAD_GLOBAL    0 (float) 
       3 LOAD_CONST    1 ('1.2') 
       6 CALL_FUNCTION   1 
       9 POP_TOP 

    3   10 LOAD_GLOBAL    1 (int) 
      13 LOAD_CONST    2 ('1') 
      16 CALL_FUNCTION   1 
      19 POP_TOP 

    4   20 LOAD_GLOBAL    2 (b) 
      23 CALL_FUNCTION   0 
      26 POP_TOP 
      27 LOAD_CONST    0 (None) 
      30 RETURN_VALUE 
>>> 

你可以只算「CALL_FUNCTION」 ......

一般

我不認爲你想這樣做在生產代碼這樣的事情...

+0

如果我不會在生產代碼中完成它,我當然不會在* my *代碼中完成它。但是,謝謝。我沒有看到CPython的反彙編。 –