2009-06-23 47 views
1

給定inspect.stack()的輸出,是否可以從堆棧幀的任何位置獲取函數對象並調用它們?如果是這樣,怎麼樣?從框架對象獲取對執行堆棧上的函數對象的引用?

(我已經知道如何獲得的函數的名稱。)

以下是我在得到:比方說,我是一個功能,我想確定我的調用者是發電機還是常規功能?我需要在函數對象上調用inspect.isgeneratorfunction()。你怎麼知道誰打電話給你? inspect.stack(),對嗎?所以,如果我能以某種方式把這些放在一起,我會回答我的問題。也許有更簡單的方法來做到這一點?

+0

爲什麼要在堆棧框架中尋找函數而不是命名空間? 用於調試? – 2009-06-23 19:57:56

回答

2

這是執行它的代碼片段。沒有錯誤檢查。這個想法是在祖父的本地人中找到被調用的函數對象。返回的函數對象應該是父對象。如果你還想搜索builtins,那麼只需查看堆棧[2] [0] .f_builtins。

def f(): 
    stacks = inspect.stack() 
    grand_parent_locals = stacks[2][0].f_locals 
    caller_name = stacks[1][3] 
    candidate = grand_parent_locals[caller_name] 

在一類的情況下,可以編寫以下(馬爾辛解決方案的啓發)

class test(object): 
    def f(self): 
     stack = inspect.stack() 
     parent_func_name = stack[1][3] 
     parent_func = getattr(self, parent_func_name).im_func 
+0

對不起,這對我沒有任何作用:(通過一些調整,我設法讓它工作,但感謝您的指導 – Marcin 2009-06-24 14:44:12

+0

通過查看你的代碼,我猜你是在一個類和檢索成員函數 – Eolmar 2009-06-24 17:39:26

0

我採取了以下做法,非常類似於Eolmar的答案。

stack = inspect.stack() 
parent_locals = stack[1][0].f_locals['self'] 
parent_func_name = stack[1][3] 
parent_func_attr = getattr(parent_locals,parent_func_name) 
parent_func = parent_func_attr.im_func 
is_parent_gen = inspect.isgeneratorfunction(func)