Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Ejecutar una función alojada en una tupla.
#1
Hola gente ¿Cómo están?, saludos Francisco.
Bueno explico lo que deseo lograr, quiero automatizar un menú(una plantilla)
y lo que me pasa es que no se como obviar el “if opc == 1: etc. etc.”
concretamente ¿hay manera de ejecutar una función(esta en otro archivo) desde una tup?.-

Muestro lo que hice:

------------------------------------------------------------------------------------------------------------
def menu(tuplaMenu, tuplaFunciones):
    print(' ================== Menú de opciones ================== \n')
     
    total = len(tuplaMenu)
    indice = 0
    for menu in tuplaMenu:     
        print(f' {str(indice +1)} - {menu.capitalize()}')
        indice += 1
    while True:
        while True:
            try:
                opc = int(input('\n Ingrese opción...: ').strip())
            except:
                print('\n La opción ingresada no es válida...')
                input(' Pulse <enter> para intentarlo nuevamente.')
       
            if opc > 0 and opc <= total:
                break
            else:
                print('\n La opción ingresada no es válida...')
                input(' Pulse <enter> para intentarlo nuevamente.')
       
        if opc == 5:
            break
        miFuncion = tuplaFunciones[opc]
        final = getattr(¿...?)

def agregar():
    print('ok')


def main():
    tuplaMenu = ('agregar', 'buscar', 'modificar', 'borrar', 'finalizar')
    tuplaFunciones = (' ', 'agregar.agregarCalculo', 'buscar.encontrar()', 'modificar_borrar.modificar_borrar'\
                      , 'modificar_borrar.modificar_borrar')
    menu(tuplaMenu, tuplaFunciones)
   

if __name__ == "__main__":
    main()

------------------------------------------------------------------------------------------------------------


Saludos a todos y gracias…
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#2
Hola, Daniel.

Si en la cadena "agregar.agregarCalculo", "agregar" es un módulo (que está importado) y "agregarCalculo" una función de ese módulo, deberías primero obtener una referencia al módulo a partir de la cadena y segundo, teniendo ya el módulo, obtener una referencia a la función. Sería algo así:

  1. miFuncion = tuplaFunciones[opc]
  2. nombre_mod, nombre_func = miFuncion.split(".")
  3. mod = globals()[nombre_mod]
  4. func = getattr(mod, nombre_func)
  5. func() # Llamar a la función obtenida.


globals() es una función incorporada que retorna un diccionario con los nombres (claves) y las referencias (valores) de los objetos globales en tu programa: https://micro.recursospython.com/recurso...ombre.html.

Con todo, creo que te convendría guardar las funciones directamente como objetos, no como cadenas:

  1. tuplaFunciones = (agregar.agregarCalculo, buscar.encontrar, ...)


Así te evitas todo el asunto de globals(), getattrs(), etc.

Saludos
Responder
#3
Hola Francisco, muy buen día para vos y todos los que te lean.-
Ya lo había logrado(en partes) con “globals” desconozco que pasa cuando
las funciones están en otros módulos, es lo que me disponía hacer pero
antes voy a leer mucho tu post porque parece que hay una manera mas eficiente,
bueno a picar código, en base a lo que propones.-

---------------------------------------------------------------------------------------------------
def menu(tuplaMenu):
    print(' ================== Menú de opciones ================== \n')
     
    total = len(tuplaMenu)
    indice = 0
   
    for menu in tuplaMenu:     
        print(f' {str(indice+1)} - {menu.capitalize()}')
        indice += 1

    while True:
        while True:
            try:
                opc = int(input('\n Ingrese opción...: ').strip())
            except:
                print('\n La opción ingresada no es válida...')
                input(' Pulse <enter> para intentarlo nuevamente.')
           
            if opc > 0 and opc <= total:
                break
            else:
                print('\n La opción ingresada no es válida...')
                input(' Pulse <enter> para intentarlo nuevamente.')
       
        if opc == total:
            break
       
        final = tuplaMenu[opc-1]
        globals()[final]()

def agregar():
    print('agregar')

def buscar():
    print('buscar')

def modificar():
    print('modificar')

def borrar():
    print('borrar')

def finalizar():
    return False

def main():
    tuplaMenu = ('agregar', 'buscar', 'modificar', 'borrar', 'finalizar')
    menu(tuplaMenu)
   

if __name__ == "__main__":
    main()
---------------------------------------------------------------------------------------------------




Slds. Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#4
Francisco, ¿Es algo parecido a esto lo que propones?
Si es así por favor decime como pasar parámetros a la función, no lo puedo lograr.-
----------------------------------------------------------------------------
def agregar():
    print('Agregar')

def buscar():
    print('Buscar')

def borrar():
    print('Borrar')

def modificar():
    print('Modificar')


opc = 0
tuplaFunciones = (agregar, buscar, borrar, modificar)
tuplaFunciones[opc]()

----------------------------------------------------------------------------

Mil disculpas por apresurarme, ya lo logre, Francisco, ¿alguna sugerencia?
para mejorarlo, gracias...
------------------------------------------------------------------------------------------ 
def agregar(par1, par2):
    print(par1)
    print(par2)

def buscar():
    print('Buscar')

def borrar():
    print('Borrar')

def modificar():
    print('Modificar')


opc = 0
par1 = 'Agregar'
par2 = 'Logrado'
tuplaFunciones = (agregar, buscar, borrar, modificar)
tuplaFunciones[opc](par1,par2)

------------------------------------------------------------------------------------------
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#5
¡Excelente! A eso mismo me refería. Smile

Saludos
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)