2010-07-19 23 views
3

在python中,我有許多函數,如下所示。我想運行名稱匹配setup_*的所有函數,而不必從main明確調用它們。函數運行的順序並不重要。我如何在Python中做到這一點?自動調用python中某個特定模式的所有函數

def setup_1(): 
    .... 

def setup_2(): 
    .... 

def setup_3(): 
    ... 

... 

if __name__ == '__main__': 
    setup_*() 

回答

8
def setup_1(): 
    print('1') 

def setup_2(): 
    print('2') 

def setup_3(): 
    print('3') 

if __name__ == '__main__':  
    for func in (val for key,val in vars().items() 
       if key.startswith('setup_')): 
     func() 

產生

# 1 
# 3 
# 2 
0

您可以使用locals()

L = locals() 
for k in L: 
    if hasattr(L[k], '__call__') and k.startswith('setup'): 
     L[k]() 

當然,你要確保你的函數的名稱並不在別處當地人出現。

此外,你也可以做這樣的事情,因爲函數是第一類對象(注意函數名不是字符串):

setupfunctions = [setup_1, setup_2, setup_3, myotherfunciton] 
for f in setupfunctions: 
    f() 
0

這並不讓功能直接對象,但必須使用eval,我我檢查與增值經銷商)溶液(擺脫的EVAL:

 def setup_1(): 
     print('setup_1') 

    def setup_2(): 
     print('setup_2') 

    def setup_3(): 
     print('setup_3') 

    if __name__ == '__main__': 
     [eval(func+'()') for func in dir() if func.startswith('setup_')] 

好吧,這裏的版本瓦爾():

def setup_1(): 
    print('setup_1') 

def setup_2(): 
    print('setup_2') 

def setup_3(): 
    print('setup_3')  

if __name__ == '__main__': 
    [vars()[func]() for func in dir() if func.startswith('setup_')] 
2

以下是一種可能的解決方案:

import types 

def setup_1(): 
    print "setup_1" 

def setup_2(): 
    print "setup_2" 

def setup_3(): 
    print "setup_3" 

if __name__ == '__main__': 
    for name, member in globals().items(): # NB: not iteritems() 
     if isinstance(member, types.FunctionType) and name.startswith("setup_"): 
      member() 
相關問題