Foros del Web » Programando para Internet » Python »

Convertir string name en callable

Estas en el tema de Convertir string name en callable en el foro de Python en Foros del Web. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Python: Ver original def doblar ( n ) :     return ( 2 *n )   fun = 'doblar' param = ...
  #1 (permalink)  
Antiguo 22/04/2014, 09:40
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Convertir string name en callable

Código Python:
Ver original
  1. def doblar(n):
  2.     return (2*n)
  3.  
  4. fun = 'doblar'
  5. param = 10
  6.  
  7. try:
  8.     type(eval(fun))
  9.     fun(param)
  10.  
  11. except NameError:
  12.     raise Exception("La funcion %s no existe!" % fun)


Revienta cuando intento hacer:

Cita:
fun(param)

Alguna idea ?
__________________
Salu2!
  #2 (permalink)  
Antiguo 22/04/2014, 09:56
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Convertir string name en callable

Que pena... me auto-respondo:

Código Python:
Ver original
  1. def doblar(n):
  2.     return (2*n)
  3.  
  4. fn_name = 'doblar'
  5. param = 10
  6.  
  7. try:
  8.     type(eval(fn_name))
  9.     fn_callable = locals()[ fn_name ]
  10.     print (fn_callable(param))
  11.  
  12. except NameError:
  13.     raise Exception("La funcion %s no existe!" % fn_name)


Pareciera ser que solo son callables las variables cuando tienen el puntero a la funcion mas que el nombre en si. El puntero se obtiene asi: locals()[ fn_name ]

Al final... en todos los lenguajes existe el tipo puntero (a archivo, etc) solo que lo maquillan un poco en el caso de Python
__________________
Salu2!
  #3 (permalink)  
Antiguo 22/04/2014, 12:50
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 8 meses
Puntos: 1329
Respuesta: Convertir string name en callable

No muchacho tu error es de asignación:


Código Python:
Ver original
  1. def doblar(n):
  2.     return (2*n)
  3.  
  4. func_name = 'doblar'
  5. param = 10
  6.  
  7. try:
  8.     func = eval(func_name)
  9.     print(func(param))
  10. except NameError:
  11.     raise Exception("La funcion %s no existe!" % fun)

Y en todo caso en la mayoría de los casos esto es una muy muy mala práctica (el eval) en cualquier lenguaje de programación y deberías evitarlo a toda costa.

Saludos
__________________
Grupo Telegram Docker en Español
  #4 (permalink)  
Antiguo 22/04/2014, 13:32
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Convertir string name en callable

Te doy la razon en que es mejor hacer:

Cita:
func = locals()[ func_name ]
que ...

Cita:
func = eval(func_name)
En cualquier caso si func_name contiene el nombre de una funcion me devuelve el puntero a la funcion pero claro que si func_name contiene un codigo malicioso lo ejecuta :D


En el caso de tratarse una clase..... ya seria verificar que posea el metodo magico __call__

Cita:
hasattr(objeto, '__call__')
O.... usar callable() en cualquier caso sino la vuelven a depredicar y ..por cierto.... como se usa ???

Código Python:
Ver original
  1. if callable(func_name):
  2.    #...

<< no me funciona! me devuelve False
__________________
Salu2!

Última edición por Italico76; 22/04/2014 a las 13:44
  #5 (permalink)  
Antiguo 22/04/2014, 14:29
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 8 meses
Puntos: 1329
Respuesta: Convertir string name en callable

Es claro que no te va a funcionar, tu le estás pasando una string el cuál no es callable.


Saludos
__________________
Grupo Telegram Docker en Español
  #6 (permalink)  
Antiguo 22/04/2014, 17:14
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Convertir string name en callable

Cita:
Iniciado por Carlangueitor Ver Mensaje
Es claro que no te va a funcionar, tu le estás pasando una string el cuál no es callable.
Vale... y tienes razon...pero entonces que gano con esa funcion callable() ? si de todas formas tengo que obtener el puntero a la funcion ?

Que gano en hacer lo siguiente ?

Código Python:
Ver original
  1. func = locals()[ func_name ]
  2.  
  3. if callable(func):
  4.     print(func(param))
  5. else:
  6.     raise Exception("La funcion %s no existe!" % func_name)


VS.

Código Python:
Ver original
  1. try:   
  2.     func = locals()[ func_name ]
  3.     print(func(param))
  4.  
  5. except KeyError:
  6.     raise Exception("La funcion %s no existe!" % func_name)


Son la misma cantidad de lineas... de hecho es lo mismo!!! solo que puedo usar IF en vez de TRY...EXCEPTION porque es "seguro" con callable() ... no le veo la utilidad
__________________
Salu2!
  #7 (permalink)  
Antiguo 22/04/2014, 17:18
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 8 meses
Puntos: 1329
Respuesta: Convertir string name en callable

Es por que no has leido para que sirve callable: https://docs.python.org/2/library/fu....html#callable

TL;DR: callable solo verifica que el objeto que le pasas es "callable", como una función o una clase.


Saludos
__________________
Grupo Telegram Docker en Español

Etiquetas: string
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 15:43.