No utilice eval!Casi nunca es necesario, las funciones en Python son sólo atributos como todo lo demás, y son accesibles, ya sea usando getattr
en una clase, o por medio de locals()
:
>>> print locals()
{'__builtins__': <module '__builtin__' (built-in)>,
'__doc__': None,
'__name__': '__main__',
'func_1': <function func_1 at 0x74bf0>,
'func_2': <function func_2 at 0x74c30>,
'func_3': <function func_3 at 0x74b70>,
}
ya que es un diccionario, puede obtener las funciones a través de la dict- llaves func_1
, func_2
y func_3
:
>>> f1 = locals()['func_1']
>>> f1
<function func_1 at 0x74bf0>
>>> f1()
one
Por lo tanto, la solución sin recurrir a eval:
>>> def func_1():
... print "one"
...
>>> def func_2():
... print "two"
...
>>> def func_3():
... print "three"
...
>>> functions_to_call = ["func_1", "func_2", "func_3"]
>>> for fname in functions_to_call:
... cur_func = locals()[fname]
... cur_func()
...
one
two
three
cómo son las funciones desconocidas cuando parece conocer las funciones que desea llamar desde una lista –
Los nombres de las funciones podrían provenir de una fuente externa, como un archivo de texto. – gregturn
Está destinado a ser un sistema semiabstracto para ejecutar juegos (para poder reutilizarlo) y por lo tanto estarán lo suficientemente cerca de un archivo de texto. – Teifion