在python中我有很多功能,如下所示。我想运行名称与setup_*
匹配的所有函数,而不必从main显式调用它们。运行函数的顺序并不重要。我怎么能在python中做到这一点?
def setup_1():
....
def setup_2():
....
def setup_3():
...
...
if __name__ == '__main__':
setup_*()
答案 0 :(得分:7)
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
答案 1 :(得分: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()
答案 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()
答案 3 :(得分:0)
这不直接获取函数对象但必须使用eval,我正在使用vars()检查解决方案以摆脱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_')]
好的,这里有vars()的版本:
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_')]