在python中,我有許多函數,如下所示。我想運行名稱匹配setup_*
的所有函數,而不必從main明確調用它們。函數運行的順序並不重要。我如何在Python中做到這一點?自動調用python中某個特定模式的所有函數
def setup_1():
....
def setup_2():
....
def setup_3():
...
...
if __name__ == '__main__':
setup_*()
在python中,我有許多函數,如下所示。我想運行名稱匹配setup_*
的所有函數,而不必從main明確調用它們。函數運行的順序並不重要。我如何在Python中做到這一點?自動調用python中某個特定模式的所有函數
def setup_1():
....
def setup_2():
....
def setup_3():
...
...
if __name__ == '__main__':
setup_*()
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
您可以使用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()
這並不讓功能直接對象,但必須使用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_')]
以下是一種可能的解決方案:
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()