Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: 2Fac3R en Noviembre 24, 2013, 12:28:35 AM

Título: [SOLUCIONADO] Return diccionario (error usando método)
Publicado por: 2Fac3R en Noviembre 24, 2013, 12:28:35 AM
No supe cómo ponerle al título  ;D

El asunto es que mi idea es "crear" un estilo switch en python (para usos propios simplemente) y ando intentando una forma que me pareció interesante, supongo que para muchos de acá no es nueva, es la siguiente:

Código (python) [Seleccionar]

def switch(forum):
    return{
        'underc0de': 'something...',
        'another one' : 'testing...'
    }[forum]

print switch('underc0de');


El problema viene cuando quiero intentar un método dentro del diccionario a retornar, por ejemplo:

Código (python) [Seleccionar]

import urllib

def switch(x,s):
    return{
        'bin2hex': hex(s),
        'encode' : urllib.quote(s)
    }[x]

print switch('encode','http://underc0de.org/foro/python/?action=post')


He comprobado antes esto:

Código (python) [Seleccionar]

print urllib.quote('http://underc0de.org/foro/python/?action=post')


Y funciona, debe ser un error tonto  ::) pero no lo veo  :'(

¿Alquien sabe qué pasa?

Zalu2!
Título: Re:return diccionario (error usando método)
Publicado por: Once en Noviembre 24, 2013, 12:49:53 AM
El error que te da es:
CitarTypeError: hex() argument can't be converted to hex
¿Verdad?

Saludos!
Título: Re:return diccionario (error usando método)
Publicado por: WhiZ en Noviembre 24, 2013, 01:14:16 AM
Coincido con 11Sep.

hex(number) -> string

Saludos!
WhiZ
Título: Re:return diccionario (error usando método)
Publicado por: 2Fac3R en Noviembre 24, 2013, 01:15:25 AM
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
El error que te da es:
CitarTypeError: hex() argument can't be converted to hex
¿Verdad?

Saludos!

Si es ese, me olvidé ponerlo  ;D , alguna idea brot?

Zalu2
Título: Re:return diccionario (error usando método)
Publicado por: WhiZ en Noviembre 24, 2013, 01:21:34 AM
Código (python) [Seleccionar]
def switch(x,s):
return {
'bin2hex':s.encode("hex"),
'encode':urllib.quote(s)
}[x]


Saludos!
WhiZ
Título: Re:return diccionario (error usando método)
Publicado por: 2Fac3R en Noviembre 24, 2013, 01:22:45 AM
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
Coincido con 11Sep.

hex(number) -> string

Saludos!
WhiZ

El asunto no tiene que ver (o eso creo) con el hex, por ejemplo:

Código (python) [Seleccionar]

def switch(x,s):
    return{
        'bin2hex': hex(s),
        'encode' : 'Otra cosa...'
    }[x]
     
print switch('bin2hex',255)


funciona correctamente, el problema es usando urllib.

edito:

No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
Código (python) [Seleccionar]
def switch(x,s):
return {
'bin2hex':s.encode("hex"),
'encode':urllib.quote(s)
}[x]


Saludos!
WhiZ

Vale, eso funciona correctamente, lo que me queda duda es porqué no funciona de la otra manera?  ???

Zalu2!
Título: Re:return diccionario (error usando método)
Publicado por: WhiZ en Noviembre 24, 2013, 01:28:49 AM
Claro. En este caso le estás pasando un int como argumento (que es lo que espera) mientras que en el ejemplo del urllib le estás pasando un string.

Probá el código que te pasé más arriba que tendría que funcionar.

Saludos!
WhiZ
Título: Re:return diccionario (error usando método)
Publicado por: Once en Noviembre 24, 2013, 01:30:16 AM
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
Coincido con 11Sep.

hex(number) -> string

Saludos!
WhiZ

El asunto no tiene que ver (o eso creo) con el hex, por ejemplo:

Código (python) [Seleccionar]

def switch(x,s):
    return{
        'bin2hex': hex(s),
        'encode' : 'Otra cosa...'
    }[x]
     
print switch('bin2hex',255)


funciona correctamente, el problema es usando urllib.

Zalu2!

No es cierto, el problema en realidad es de la función hex() porque sólo te convierte a hexadecimal números enteros y urllib.quote() recibe una cadena una cadena. Además debes tener encuenta que Python genera todo el diccionario Así que obligatoriamente (si no hay errores) ejecuta ambas funciones hex() y urllib.quote()

Saludos!
Título: Re:return diccionario (error usando método)
Publicado por: 2Fac3R en Noviembre 24, 2013, 01:37:11 AM
Vale, ahora entiendo, era eso jeje, eso me pasa por estar ya 9 horas seguidas en el ordenador  ::)

Tema solucionado.
Gracias! broths

Zalu2
Título: Re:[SOLUCIONADO] return diccionario (error usando método)
Publicado por: Once en Noviembre 24, 2013, 04:33:07 PM
La única forma que se me ocurre de hacer lo que necesitas de una forma similar a la que planteas al inicio sería algo así:

Código (python) [Seleccionar]
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib


def hexadecimal(texto):
    return texto.encode("hex")

def quote(texto):
    return urllib.quote(texto)

def switch(opcion):
    return {
            "bin2hex": "hexadecimal",
            "encode": "quote",
    }[opcion]

print locals()[switch("encode")]("http://underc0de.org/foro/python/?action=post")


Saludos!
Título: Re:[SOLUCIONADO] return diccionario (error usando método)
Publicado por: 2Fac3R en Noviembre 25, 2013, 04:06:34 PM
jooder cada dia flipo mas con python :o

Bastante interesante el ejemplo, mi idea era "generar" un switch un poco más compacto, pero la verdad esta idea me ha gustado bastante, me has puesto a pensar bastante xD (me costó entender la sintaxis, creo que estoy un poco oxidado jaja) y no encontré mucha información por papi google.

Estaré probando para ver cuanto jugo le sacamos..

Siempre tienes algo bajo la manga once :P

Zalu2!
Título: Re:[SOLUCIONADO] return diccionario (error usando método)
Publicado por: Once en Noviembre 25, 2013, 04:58:54 PM
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
Bastante interesante el ejemplo, mi idea era "generar" un switch un poco más compacto, pero la verdad esta idea me ha gustado bastante, me has puesto a pensar bastante xD (me costó entender la sintaxis, creo que estoy un poco oxidado jaja) y no encontré mucha información por papi google.

Ups, lo siento bro, te explico:

locals() te regresa un diccionario con los elementos locales, globals() te regresa un diccionario con los elementos globales. Al regresar un diccionario, puedes acceder a cualquier valor con [] en nuestro caso con [switch("encode")] (que nos regresa: quote) y también le puedes pasar parametros como a una función normal ("http://underc0de.org/foro/python/?action=post")

Así que quedaría algo así: locals()["quote"](parametros) y lo que haría es llamar a la función quote pasándole como parametro "http://underc0de.org/foro/python/?action=post"

No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
Siempre tienes algo bajo la manga once :P

Zalu2!

Yo culpo a Python, cada día descubres algo nuevo :p

Saludos bro y que bueno verte de nuevo
Título: Re:[SOLUCIONADO] return diccionario (error usando método)
Publicado por: 2Fac3R en Noviembre 30, 2013, 10:28:47 PM
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
Bastante interesante el ejemplo, mi idea era "generar" un switch un poco más compacto, pero la verdad esta idea me ha gustado bastante, me has puesto a pensar bastante xD (me costó entender la sintaxis, creo que estoy un poco oxidado jaja) y no encontré mucha información por papi google.

Ups, lo siento bro, te explico:

locals() te regresa un diccionario con los elementos locales, globals() te regresa un diccionario con los elementos globales. Al regresar un diccionario, puedes acceder a cualquier valor con [] en nuestro caso con [switch("encode")] (que nos regresa: quote) y también le puedes pasar parametros como a una función normal ("http://underc0de.org/foro/python/?action=post")

Así que quedaría algo así: locals()["quote"](parametros) y lo que haría es llamar a la función quote pasándole como parametro "http://underc0de.org/foro/python/?action=post"

No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
Siempre tienes algo bajo la manga once :P

Zalu2!

Yo culpo a Python, cada día descubres algo nuevo :p

Saludos bro y que bueno verte de nuevo

Si, al parecer lo entendí bien, que bueno que me lo confirmas, la verdad es que python es un lenguaje sorprendente en todos sus sentidos, tambien he visto algunas maravillas con perl  ::)

PD: Por ahí tengo el proyecto que estabamos realizando (el wargame), a ver cuando nos topamos en el skype  :P

Zalu2