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