Alternativamente tienes getattr
. Ver siguiente fragmento:
>>> import sys
>>> getattr(sys,'exc_info')
<built-in function exc_info>
>>> getattr(sys,'exc_info')()
(None, None, None)
Pregunta
Tengo dos archivos;
El primer archivo, myProgram.py
, es un archivo de Python con varias funciones
Una de las funciones contenidas en el interior es myFunction
esta función se llamaría con
import myProgram
myProgram.thisFunction()
myProgram.thatFunction()
El segundo archivo contiene un sistema de menú, con llamadas a las funciones en myProgram.py
Me gustaría llamar a una función particular basada en un argumento pasado a una función en File2
def file2_function(function):
myProgram.function
file2_function(thisFunction(x,y,z))
lo que esencialmente crearía myProgram.ThisFunction (x, y, z) y lo ejecutaría.
Supongo que podría hacer esto usando un montón de declaraciones IF/Elif, digamos:
def file2_function(function):
if function == 1:
myProgram.thisFunction
elif function == 2:
myProgram.thatFunction
Aunque eso podría estar desordenado ya que ya estoy usando muchas declaraciones if/elif/else para el sistema de menú.
¿Hay una mejor manera (o es la ruta if/elif el camino a seguir?)
Solución 4
Alternativamente tienes getattr
. Ver siguiente fragmento:
>>> import sys
>>> getattr(sys,'exc_info')
<built-in function exc_info>
>>> getattr(sys,'exc_info')()
(None, None, None)
Otros consejos
los *args
en la función file2_function
significa que los argumentos se pasarán a la función en la que llama:
def func1(a):
print a
def file2_function(function,*args):
function(*args)
file2_function(func1,4)
#4
Puede crear un diccionario donde la clave sea el nombre de la función, y el valor es la función misma. Ejemplo corto:
functions = { 'add' : lambda x,y : x + y, 'mult': lambda x,y : x * y, 'div' : lambda x,y : x / y, 'sub' : lambda x,y : x - y }
functions['add'](1,2) # returns 3
@Aga te dio una buena pista. Cuando escribo aplicaciones CLI, normalmente me gusta:
def func1():
pass
def func2():
pass
def func3():
pass
def func_caller(name):
func_dict = {
'func1': func1,
'func2': func2,
'func3': func3
}
try:
func_dict[name]()
except KeyError:
print "no such func"