[SOLUCIONADO] Return diccionario (error usando método)

Iniciado por 2Fac3R, Noviembre 24, 2013, 12:28:35 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Noviembre 24, 2013, 12:28:35 AM Ultima modificación: Marzo 16, 2014, 08:55:29 PM por Expermicid
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

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

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

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!
Sólo el conocimiento te hace libre.

El error que te da es:
CitarTypeError: hex() argument can't be converted to hex
¿Verdad?

Saludos!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Coincido con 11Sep.

hex(number) -> string

Saludos!
WhiZ


No tienes permitido ver los links. Registrarse o Entrar a mi 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
Sólo el conocimiento te hace libre.

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


Saludos!
WhiZ


Noviembre 24, 2013, 01:22:45 AM #5 Ultima modificación: Noviembre 24, 2013, 01:29:09 AM por 2Fac3R
No tienes permitido ver los links. Registrarse o Entrar a mi 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

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 los links. Registrarse o Entrar a mi cuenta
Código: python
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!
Sólo el conocimiento te hace libre.

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


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi 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

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!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Vale, ahora entiendo, era eso jeje, eso me pasa por estar ya 9 horas seguidas en el ordenador  ::)

Tema solucionado.
Gracias! broths

Zalu2
Sólo el conocimiento te hace libre.

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
#!/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!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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!
Sólo el conocimiento te hace libre.

No tienes permitido ver los links. Registrarse o Entrar a mi 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 ("No tienes permitido ver los links. Registrarse o Entrar a mi cuenta")

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 "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta"

No tienes permitido ver los links. Registrarse o Entrar a mi 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







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi 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 ("No tienes permitido ver los links. Registrarse o Entrar a mi cuenta")

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 "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta"

No tienes permitido ver los links. Registrarse o Entrar a mi 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
Sólo el conocimiento te hace libre.