Pregunta

Tengo dos archivos;

  1. El primer archivo, myProgram.py, es un archivo de Python con varias funciones
    Una de las funciones contenidas en el interior es myFunctionesta función se llamaría con

    import myProgram
    myProgram.thisFunction()
    myProgram.thatFunction()
    
  2. 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?)

¿Fue útil?

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"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top