Saltar al contenido
Underc0de /foro

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

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

Tema anterior - Siguiente tema

0 Miembros y 2 Visitantes están viendo este tema.

Avatar de 2Fac3R
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.

12 respuestas

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

Saludos!







Los enlaces son solo para miembros. Registrate o iniciá sesión

Avatar de WhiZ
Coincido con 11Sep.

hex(number) -> string

Saludos!
WhiZ


Avatar de 2Fac3R
Cita de: 11Sep 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!

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

Zalu2
Sólo el conocimiento te hace libre.

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


Saludos!
WhiZ


Avatar de 2Fac3R
Noviembre 24, 2013, 01:22:45 AM #5 Ultima modificación: Noviembre 24, 2013, 01:29:09 AM por 2Fac3R
Cita de: WhiZ en Noviembre 24, 2013, 01:14:16 AM
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:

Cita de: WhiZ en Noviembre 24, 2013, 01:21:34 AM
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.

Avatar de WhiZ
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


Avatar de Once
Cita de: 2Fac3R en Noviembre 24, 2013, 01:22:45 AM
Cita de: WhiZ en Noviembre 24, 2013, 01:14:16 AM
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!







Los enlaces son solo para miembros. Registrate o iniciá sesión

Avatar de 2Fac3R
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.

Avatar de Once
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!







Los enlaces son solo para miembros. Registrate o iniciá sesión

Avatar de 2Fac3R
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.

Avatar de Once
Cita de: 2Fac3R en Noviembre 25, 2013, 04:06:34 PM
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"

Cita de: 2Fac3R en Noviembre 25, 2013, 04:06:34 PM
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







Los enlaces son solo para miembros. Registrate o iniciá sesión

Avatar de 2Fac3R
Cita de: 11Sep en Noviembre 25, 2013, 04:58:54 PM
Cita de: 2Fac3R en Noviembre 25, 2013, 04:06:34 PM
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"

Cita de: 2Fac3R en Noviembre 25, 2013, 04:06:34 PM
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.

🔗 Temas relacionados

Grupo de WhatsApp