2012-10-11 33 views
11

Digamos que tengo una función bar 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?¿Llamar a una función desde cadena dentro del mismo módulo en Python?

# 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 'objeto de módulo' para ser el primer parámetro. ¿Cómo obtener el 'objeto de módulo' del módulo actual?

Respuesta

21

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

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

Si realmente desea que el objeto módulo, se pueden obtener de 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 una entrada del usuario ... Esto puede tener efectos secundarios potencialmente malos si accidentalmente le da acceso a los usuarios a las funciones incorrectas.

10

uso de un diccionario que mantiene la asignación de funciones al que desea llamar:

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

que siempre agradezco una respuesta que resuelve _problem_ del PO en lugar de su/su _pregunta_. +1 – gboffi

0

¿Qué tal esto:

eval('bar' + '()') 
Cuestiones relacionadas