2012-11-02 75 views
1

我想做一個函數來確定它的調用方式。我知道如何通過檢查模塊來完成這項工作。例如,this question,運作良好,並提供了在可變lines我的期望的輸出如下所示:如何從交互式shell中訪問調用源代碼

def hello(x): 
    frame,filename,line_number,function_name,lines,index=\ 
     inspect.getouterframes(inspect.currentframe())[1] 
    print(frame,filename,line_number,function_name,lines,index) 

的問題是,這種解決方案並沒有在交互式命令行會話工作。例如,在命令行,結果是這樣的:

>>> y = hello(7) 
(<frame object at 0x01ECA9E8>, '<stdin>', 1, '<module>', None, None) 

的問題是,源文件是'<stdin>',所以lines變量是None。如何在交互式會話期間訪問呼叫線路以查找包含字符串y = hello(7)的結果?

+1

您不能,因爲交互式會話不會跟蹤輸入的行。如果你願意要求'ipython',那麼可能有辦法在那裏做。或者你可以在交互式會話中編寫你自己的wrapper,它只是跟蹤讀入'stdin'中的行並將它們傳遞過去(這可能不正確,但可以通過反覆試驗找到正確的細節),那麼可以索引到那。 – abarnert

回答

2

這可能不可能,因爲@abarnert說。不過,至少有部分解決方法。獲取源代碼行不是最大的問題;像readline這樣的模塊會跟蹤它們。交互式Python和iPython公開他們的行略有不同(嘆息),但也可以均衡。 (我show包,例如,做到這一點,它的linecacher模塊穿上均衡正常Python和不同的互動風味源接入單板。)

更大的問題是,即使一旦你的源代碼, inspect不提供合法的行號(如inspect.currentframe().f_back.f_lineno交互調用時在正常代碼工作很大,但給像1或<stdin>呼叫的點值。)

但我還沒有準備好把它不可能。基於交互式Python和iPython生成的追溯,似乎可能有足夠的信息來重建「這個調用來自哪裏?」需要付出多少努力,以及答案會有多強大......這些都是未解決的問題。

相關問題