2014-12-02 49 views
2

說我有一個模塊,像這樣:得到我自己的模塊定義的所有方法

def print_hello(name): 
    " prints a greeting " 
    print("Hello, {}!".format(name.title())) 

我想成立一​​個sys.settrace我的模塊上,所以每當從我的模塊功能被稱爲,它打印到標準輸出的塊,像這樣

CALLED FUNCTION: say_hello() 
Hello, Alex! 

預見的是,跟蹤方法將拿起這是所謂的所有方法,這導致這樣的:

$ python3 trace_example.py 
Called function: print_hello 
Hello, Alex! 
Called function: _remove 

如何判斷某個方法是否在當前模塊中?

(這裏是我的跟蹤功能,如果你想知道:)

import sys 
def tracefunc(frame, event, args): 
    if event == 'call': 
    print("Called function: {}()".format(frame.f_code.co_name)) 
sys.settrace(tracefunc) 
+0

也許這樣,使用'''inspect''' - [從棧幀中檢索模塊對象](http://stackoverflow.com/questions/2000861/retrieve-module-object -from-stack-frame) – wwii 2014-12-02 14:45:21

+0

雖然有幫助,但仍有以下問題: print(dir(this_module)) '['__builtins__','__cached__','__doc__','__file__','__loader__ '','__name__','__package__','__spec__','inspect','print_hello','sys','tracefunc']' 理想情況下,它只有'print_hello'和'tracefunc' – corvid 2014-12-02 14:50:46

回答

1

您可以檢查框對象的模塊名稱:

frame.f_globals['__name__'] 

或者,如果你想查詢以前的(我不確定哪一個現在更有趣):

frame.f_back.f_globals['__name__'] 

當然,n注意f_back可能是None,並且全局字典可能沒有__name__成員。

UPDATE: 如果你有一個模塊對象,要列出所有的頂級可調用的對象:

callables = [n for n,f in module.__dict__.items() if hasattr(f, '__call__')] 

這也是類型將得到的,因爲從技術上它們看起來有點像功能,但是如果你願意,你可以進一步細化這個條件。 (請參閱此其他question瞭解更多詳細信息。

+0

模塊的名稱,但是從那裏,我將如何提取模塊內的方法? – corvid 2014-12-02 14:42:14

+0

您的問題是_如何判斷ethod在當前模塊中?_但標題是_get在我自己的module_中定義的所有方法。這是兩個不同的問題......你需要哪一個? – rodrigo 2014-12-02 14:43:14

+0

我需要屬於被調用的當前模塊的所有方法。所以這看起來很接近它,但是我認爲需要有一些列表理解來提取所有不在內置的方法。所以在這種情況下,最終結果看起來像是:'['print_hello']',因爲我只在模塊 – corvid 2014-12-02 14:44:24

相關問題