2010-05-16 26 views
3

我在我的python腳本中有一個未知數量的函數(當然,它是已知的,但不是常量),它以站點_... 開頭我想知道是否還有一段路要走通過一些主要功能中的所有這些功能來調用它們。 類似:在Python中執行一些函數

foreach function_that_has_site_ as coolfunc 
    if coolfunc(blabla,yada) == true: 
     return coolfunc(blabla,yada) 

所以它會去通過他們所有,直到它得到的東西是真的。

謝謝!

+1

請注意,你可能會更好試圖做這一種不同的方式 - 爲實例,而不是將它們全部定義爲名爲'site_ZZZZ'的頂級函數,而是將它們存儲爲函數的列表或字典。 – Amber 2010-05-16 08:49:56

回答

5

inspect模塊,在其他的答案已經提到的,因爲你可以輕鬆地過濾你關心對象的名稱和值是特別方便。 inspect.getmembers需要參數:其成員你探索的對象,一個謂詞(函數返回bool)將接受(返回True的)只有你關心的對象。

得到你需要以下衆所周知的成語「也就是這個模塊對象」:

import sys 
this_module = sys.modules[__name__] 

在你的謂詞,您只需要選擇哪些是函數對象,並具有與site_開頭的名稱:

import inspect 
def function_that_has_site(f): 
    return inspect.isfunction(f) and f.__name__.startswith('site_') 

在掌握這兩個項目,你的循環就變成了:

for n, coolfunc in inspect.getmembers(this_module, function_that_has_site): 
    result = coolfunc(blabla, yada) 
    if result: return result 

我還分割了循環體,以便每個函數只被調用一次(這既節省了時間是一種更安全的方法,避免了可能的副作用)...以及在Python ;-)重新措辭它

+0

http://codepad.org/gq4ZYJPJ 得到 result = funcme() TypeError:'tuple'對象不可調用 有沒有我在這裏失蹤的東西? – Asaf 2010-05-17 19:03:03

+0

@asaf,我的不好 - 我在'for'循環中有個拼寫錯誤(它需要分別獲取名稱和函數)。現在編輯並修復它,添加'n'部分。 – 2010-05-17 19:41:26

+0

添加n,錯誤: result = funcme() TypeError:'NoneType'對象不可調用 – Asaf 2010-05-17 20:14:33

3

您是否嘗試過使用檢查模塊?

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

下將返回方法:

inspect.getmembers 

然後,你可以調用與:

methodobjToInvoke = getattr(classObj, methodName) 
methodobj("arguments") 
0

嘗試dir()globals()locals()。或者inspect模塊(如上所述)。

def site_foo(): 
    pass 

def site_bar(): 
    pass 

for name, f in globals().items(): 
    if name.startswith("site_"): 
    print name, f() 
1

這種方法經過當前模塊的所有屬性,並且執行它與起始site_名稱查找所有功能:

import sys 
import types 
for elm in dir(): 
    f = getattr(sys.modules[__name__], elm) 
    if isinstance(f, types.FunctionType) and f.__name__[:5] == "site_": 
     f() 

功能型檢查是不必要的,如果只功能是具有名稱從site_開始。

1
def run(): 
    for f_name, f in globals().iteritems(): 
     if not f_name.startswith('site_'): 
      continue 
     x = f() 
     if x: 
      return x 
1

這是最好用裝飾列舉你所關心的功能:

_funcs = [] 

def enumfunc(func): 
    _funcs.append(func) 
    return func 

@enumfunc 
def a(): 
    print 'foo' 

@enumfunc 
def b(): 
    print 'bar' 

@enumfunc 
def c(): 
    print 'baz' 

if __name__ == '__main__': 
    for f in _funcs: 
    f()