Foros del Web » Programando para Internet » Python »

Funciones en tiempo de ejecución

Estas en el tema de Funciones en tiempo de ejecución en el foro de Python en Foros del Web. Hola, me gustaría saber como hace python o mejor dicho las librerías que crea la gente lista jajjaa para python ermiten llamar a un método ...
  #1 (permalink)  
Antiguo 19/04/2014, 07:30
 
Fecha de Ingreso: marzo-2009
Mensajes: 8
Antigüedad: 15 años, 1 mes
Puntos: 1
Funciones en tiempo de ejecución

Hola, me gustaría saber como hace python o mejor dicho las librerías que crea la gente lista jajjaa para python ermiten llamar a un método en base a un "string". Me explico, cuando hacemos una petición GET "python" llama al metodo do_GET, cuando mandamos una petición FORODELWEB python llama a do_FORODELWEB, como se programa esto, es decir, como puedo decir a python que en base a un "string" llame a un método u otro.

Ejemplo de la duda...

def nombreCualquiera():
#DEFINIDO POR EL USUARIO DE LA LIBRERÍA POR EJEMPLO CON HERENCIA DE LA CLASE

imaginaos ahora que la librería se llama pepe y tiene un método llamado "llamarfuncion(x)" como haría para llamar a la ¿función x?
pepe.llamarfuncion(nombreCualquiera) y en ese momento llama al método definido por el usuario de la librería (el cual cuando creamos la librería no sabemos que existe, pues es el usuario quien crea ese método siguiendo un patrón handler).

No se si me he explicado suficientemente bien.
Muchas gracias de antemano.
  #2 (permalink)  
Antiguo 19/04/2014, 11:38
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Funciones en tiempo de ejecución

Me parece haber visto una funcion para eso.. pero no recuerdo..... en fin... mira si te sirve:

http://stackoverflow.com/questions/3...method-by-name
__________________
Salu2!
  #3 (permalink)  
Antiguo 20/04/2014, 00:48
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Funciones en tiempo de ejecución

Hola kimizombie!

Para hacer lo que necesitás, debés usar herencias, ya sea con funciones o clases y funciones, lo mejor serían las clases porque son más completas y estructuradas, pero si es algo simple lo que querés hacer, estaría bien una o varias funciones.

Aquí te dejo un código que hice que hace justamente lo que pedís.

Crea un archivo del nombre que desees en formato .py
Crea un archivo en formato .py con el nombre Contador
Dentro del archivo que creaste en el primer paso insertá estas líneas de código:


Código Python:
Ver original
  1. # -*- coding: utf-8 -*-
  2.  
  3. import Contador # Importamos la libreria Contador
  4.  
  5. Texto = raw_input("Escribi una frase: ") # Guardamos en la variable Texto la frase que escribio el usuario
  6. print # Dejamos un salto de linea
  7. Contador.Caracteres(Texto) # Llamamos a la libreria Contador y a la funcion Caracteres, pasamos la variable Texto como argumento y esperamos que la libreria nos retorne los valores que le hemos heredado.
  8. print # Dejamos otro salto de linea
  9. print ("Tu frase tiene %d caracteres" % len(Texto)) # Imprimimos en pantalla la cantidad de caracteres que tiene la frase anteriormente ingresada (se cuentan los espacios).
  10.  
  11. raw_input()
# Detiene la ejecucion del programa, esperando una respuesta del usuario (esto se usa muchas veces para que la consola no se cierre, en este caso hacemos ese uso).

Dentro del librería Contador debés ingresar estas líneas de código:

Código Python:
Ver original
  1. def Caracteres(Cadena): # Funcion Caracteres con el argumento Cadena que le hemos heredado de la variable Texto. Nota: El nombre del argumento en esta funcion puede ser cualquiera.
  2.     for Num, Cadena2 in enumerate(Cadena): # Almacenamos un numero en la variable Num, en Cadena2 estara un caracter de la X frase, mientras el bucle vaya repitiendo, el valor de Num se ira incrementando y la variable Cadena2 guardara los caracteres de la frase que escribio el usuario.
  3.         print Num, Cadena2
# Aqui retornamos imprimiendo los valores de las variables Num y Cadena2.

Debés ejecutar el programa que tiene el nombre del paso 1 que asignaste, no el contador, ya que el contador es una librería.
Cuando ejecutés el programa, se generará un archivo en formato .pyc que es una compilación de la librería Contador.
Aquí tienes la respuesta de porque se genera ese archivo bytecode:

Python tiene, no obstante, muchas de las características de los lenguajes compilados, por lo que se podría decir que es semi interpretado. En Python, como en Java y muchos otros lenguajes, el código fuente se traduce a un pseudo código máquina intermedio llamado bytecode la primera vez que se ejecuta, generando archivos .pyc o .pyo (bytecode optimizado), que son los que se ejecutarán en sucesivas ocasiones.
Fuente extraída del manual Python para todos.

El archivo Contador.py debe estar en la misma carpeta/directorio donde estará el programa que creaste en el paso 1.

Aquí te dejo una muestra de como funciona:

Escribi una frase: hola amigos como estan

0 h
1 o
2 l
3 a
4
5 a
6 m
7 i
8 g
9 o
10 s
11
12 c
13 o
14 m
15 o
16
17 e
18 s
19 t
20 a
21 n

Tu frase tiene 22 caracteres


El código que te dejé de ejemplo es simple, por lo que se podría complicar más, todo depende de cuanto sepás y para que lo necesités.

Espero haberte ayudado.
Que andés bien!! Suerte!!!
  #4 (permalink)  
Antiguo 27/04/2014, 04:12
 
Fecha de Ingreso: marzo-2009
Mensajes: 8
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Funciones en tiempo de ejecución

Ya está solucionado, efectivamente se hacía como decía Italico, es decir, de la siguiente manera

Código:
class MiClase():
...     def metodoGeneral(self):
...         print("Correcto")
... 
clase = MiClase()
metodo = getattr(clase,"metodoGeneral")
metodo()
Esto imprime correcto y es así como se programan los "framework" como django de modo que nosotros podemos utilizar esta función para llamar a un método que no está definido en nuestra clase y que por herencia el usuario lo ha creado (exactamente este es el método utilizado en Django).

Un saludo :)

Última edición por kimizombie; 27/04/2014 a las 04:18
  #5 (permalink)  
Antiguo 28/04/2014, 07:19
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Funciones en tiempo de ejecución

Incluso se pude hacer mas general........ primero lo facil.... con eval()

Código Python:
Ver original
  1. class MiClase():
  2.     def unMetodoCualquiera(self):
  3.         print("Correcto : has accedido!")
  4.  
  5.     def otroMetodoCualquiera(self):
  6.         print("Correcto : has accedido a otro metodo!")
  7.  
  8.  
  9. nom_clase = "MiClase"
  10. clase     = eval(nom_clase+'()')
  11.  
  12. metodo    = getattr(clase,"unMetodoCualquiera")
  13. metodo()
  14.  
  15. metodo    = getattr(clase,"otroMetodoCualquiera")
  16. metodo()


Ahora... la version "segura" sin eval() ...

Código Python:
Ver original
  1. class MiClase():
  2.     def unMetodoCualquiera(self):
  3.         print("Correcto : has accedido!")
  4.  
  5.     def otroMetodoCualquiera(self):
  6.         print("Correcto : has accedido a otro metodo!")
  7.  
  8.  
  9. nom_clase = "MiClase"
  10. clase = locals()[nom_clase]
  11.  
  12. if isinstance(clase, object):
  13.  
  14.     metodo    = getattr(clase(),"unMetodoCualquiera")
  15.     metodo()
  16.  
  17.     metodo    = getattr(clase(),"otroMetodoCualquiera")
  18.     metodo()

Aho tienes...especifico Clase y Metodo ***
__________________
Salu2!

Última edición por Italico76; 28/04/2014 a las 07:51
  #6 (permalink)  
Antiguo 28/04/2014, 11:02
 
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 1 mes
Puntos: 18
Respuesta: Funciones en tiempo de ejecución

Puedes usar decoradores classmethod o staticmethod si quieres hacer callable la función sin instaciar la clase primero.

Código Python:
Ver original
  1. class MiClase():
  2.  
  3.     @classmethod
  4.     def unMetodoCualquiera(self):
  5.         print ("Correcto : has accedido!")
  6.  
  7.     @staticmethod
  8.     def otroMetodoCualquiera():
  9.         print ("Correcto : has accedido a otro metodo!")
  10.  
  11.  
  12. getattr(MiClase, 'unMetodoCualquiera')()
  13. MiClase.otroMetodoCualquiera()

la diferencia es que classmethod recibe la clase como primer argmento.

Saludos.

Etiquetas: funciones, gui, programa, tiempo, usuario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:07.