2013-05-11 78 views
0

這個想法是,當寫一個新函數時,它的變量名會自動附加到列表中。有沒有辦法將函數的名字自動添加到列表中?

只是要注意,我知道我可以使用mylist.append(無論),但我特別尋找一種方法來自動追加,而不是手動。

因此,如果我們開始與...

def function1(*args): 
    print "string" 

def function2(*args): 
    print "string 2" 

mylist = [] 

...是有辦法追加「功能1」和「函數2」自動MYLIST這樣它最終會這樣的..

mylist = [function1, function2] 

具體來說,我想列出變量名稱,而不是字符串(例如「function1」)。

我在學習Python,只是在試驗,所以這個目前沒有任何特定的用途,我只是想知道它是否可能。

如果我不清楚,請提前感謝您的任何建議和快樂的回答。

**

回答

1

函數對象只需添加到列表:

mylist = [function1, function2] 

或使用.append()

mylist.append(function1) 
mylist.append(function2) 

Python函數是第一類對象。它們是值,就像類,字符串和整數一樣。

如果你想爲一個整體模塊自動執行此,您可以使用globals() function快速列出迄今爲止該模塊中定義的所有功能,從inspect.isfunction() predicate一點幫助:

import inspect 
mylist = [v for v globals().itervalues() if inspect.isfunction(v) and v.__module__ == __name__] 

v.__module__ == __name__測試確保我們只列出當前模塊的功能,而不是我們導入的任何東西。

但是,顯式仍然比隱式更好。無論每個功能下面添加mylist.append(functionname),或使用裝飾:

mylist = [] 
def listed(func): 
    mylist.append(func) 
    return func 

@listed 
def function1(): 
    pass 

@listed 
def function2(): 
    pass 

每次函數「標記」與@listed裝飾添加到列表mylist

+0

嗨馬丁,謝謝你的迴應。我知道可以做到這一點,但我特別想知道是否可以自動做到這一點。我的想法是,如果我要編寫許多函數,那麼我就不必費心將每個函數添加到列表中。 – user2061277 2013-05-11 17:30:01

+0

@ user2061277顯式優於隱式。它甚至會如何決定將什麼放入這個列表,哪些不是? – delnan 2013-05-11 17:32:23

+0

@ user2061277:從您的問題中不清楚。有很多選擇;使用裝飾器('標記'你想添加到列表中的所有函數,只需要一些額外的語法),列出'globals()'命名空間中的所有對象,然後過濾函數等。 – 2013-05-11 17:32:45

0

原則上,你可以這樣做與裝飾,這將可能有資格作爲一個半自動的解決方案:

這樣一個裝飾的
@gather 
def function1(): 
    print "function 1" 

@gather 
def function2(): 
    print "function 2" 

一個實現本質上是得到一個功能函數參數:

function_list = [] 

def gather(func): 
    function_list.append(func) # or .append(func.__name__) 
    return func 

在這個簡單的化身,它可能是沒有作用的,但流行的庫和框架通常採用稍微增強該技術的版本。作爲例子,請參閱Flask的@app.route裝飾器,以指定處理特定HTTP請求的函數。

相關問題