¿Llamando a una función desde una cadena dentro del mismo módulo en Python?

Digamos que tengo una bar funciones dentro de un módulo llamado foo.py En algún lugar dentro de foo.py, quiero poder llamar a bar () desde la cadena “bar”. ¿Cómo puedo hacer eso?

 # filename: foo.py import sys def bar(): print 'Hello, called bar()!' if __name__ == '__main__': funcname = 'bar' # Here I should be able to call bar() from funcname 

Sé que existe una función incorporada en Python llamada ‘getattr’. Sin embargo, requiere que ‘objeto de módulo’ sea el primer parámetro. ¿Cómo obtener el ‘objeto módulo’ del módulo actual?

globals es probablemente más fácil de entender. Devuelve el __dict__ del módulo actual, por lo que podría hacer:

 func_I_want = globals()['bar'] #Get the function func_I_want() #call it 

Si realmente desea el objeto de módulo, puede obtenerlo desde sys.modules (pero normalmente no lo necesita):

 import sys.modules this_mod = sys.modules[__name__] func = getattr(this_mod,'bar') func() 

Tenga en cuenta que, en general, debe preguntarse por qué quiere hacer esto. Esto permitirá que se llame a cualquier función a través de una cadena, que probablemente sea la entrada del usuario … Esto puede tener efectos secundarios potencialmente negativos si accidentalmente les da a los usuarios acceso a las funciones incorrectas.

Use un diccionario que mantenga la asignación de funciones a las que desea llamar:

 if __name__ == '__main__': funcnames = {'bar': bar} funcnames['bar']()