2012-05-01 23 views
0

稱爲比方說,我有B.py房顫如何在模塊A定義獲得在B定義的函數列表中,如果房顫的B

import A 

def F(): 
    pass 

def G(): 
    pass 

if __name__ == '__main__': 
    A.f() 

當我運行它,我想A.f來定義的函數輸出列表在B.py這樣

./B.py 
['F', 'G'] 

的問題是什麼,我應該在A.py寫?

def f(): 
    ??? 

這似乎是可能的,因爲doctest做這樣的事情。

更新感謝您的回覆,但我忘了再提一個限制:我不想在A.py中做import B

讓我試着解釋爲什麼:A.py是運行MapReduce作業的庫。您只需導入A並在腳本的各個末尾運行一些A.f。然後A.f分析你定義的功能,並在服務器上執行它們。所以A.f無法導入它被調用的每個模塊。

或者可以嗎?函數能夠知道它從哪裏被調用?

更新

def f(): 
    module = sys.modules['__main__'] 
    functions = inspect.getmembers(module, inspect.isfunction) 
    ... 
+2

可能重複(http://stackoverflow.com/questions/ 1106840/find-functions-displayed-defined-in-a-module-python) – kennytm

回答

3
def f(): 
    import B 
    import inspect 

    functions=inspect.getmembers(B,inspect.isfunction) 

http://docs.python.org/library/inspect.html#inspect.getmembers

編輯

我還沒有嘗試過,但似乎你可以通過模塊作爲參數傳遞給f和使用。

def f(mod): 
    import inspect 
    functions=inspect.getmembers(mod,inspect.isfunction) 
    return functions 

然後,B,你可以這樣做:的[在一個模塊(Python)的明確定義查找功能]

import sys 
import A 
myfuncs=A.f(sys.modules[__name__]) 
+0

謝謝你,看我的更新 – alexanderkuk

+0

@alexanderkuk我發佈了一個想法* *可能會爲你工作,雖然我沒有時間來測試它。 – mgilson

+0

我爲你測試了它。似乎工作正常。 – tapan

2

這其實是很容易使用the dir() function做到:

import B 

def f(): 
    print(dir(B)) 

其中給出:

['A', 'F', 'G', '__builtins__', '__cached__', '__doc__', '__file__', '__name__', '__package__'] 

正如你所看到的,這也包括隱藏的值,存在於模塊中,你是正常的沒看見。如果您想更具體地瞭解您想要的內容,請查看the inspect module

+0

你不能做循環導入。 –

+0

@NiklasB。你可以 - 嘗試運行這個。有用。我不是說這是一個很好的做法,但它確實有效。 –

+0

真的嗎?我必須檢查,上次我需要這樣的事情是不可能的。當然,如果它是我的評論,當然不會。 –

相關問題