Llama automáticamente a todas las funciones que coincidan con un determinado patrón en Python

En Python tengo muchas funciones como las de abajo. Me gustaría ejecutar todas las funciones cuyo nombre coincide con setup_* sin tener que llamarlas explícitamente desde main. El orden en que se ejecutan las funciones no es importante. ¿Cómo puedo hacer esto en 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() 

rendimientos

 # 1 # 3 # 2 

Aquí hay una posible solución:

 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() 

Puedes usar los locals()

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

Por supuesto, querrá asegurarse de que los nombres de sus funciones no aparezcan en ningún otro lugar en los locales.

Además, también podría hacer algo como esto porque las funciones son objetos de primera clase (tenga en cuenta que los nombres de las funciones no son cadenas):

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

Esto no obtiene los objetos de función directamente, pero debe usar eval. Estoy comprobando la solución con vars () para deshacerme de 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_')] 

Ok, aquí la versión con 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_')]