Python: Alternativa al switch() ?

AikonCWD

Hola buenas

Estoy iniciándome en el mundo de Python, estoy bastante verde todavía y tengo dudas de noob. Me paso más rato en stackoverflow que picando código xD
Sé que no existe switch/selec-case en python, estoy programando un bot para twitter y a la hora de definir los comandos del bot encuentro en falta esa instrucción, os dejo el código:

EDIT: Menuda mierda la etiqueta [code] de mediavida, quien la ha programado, un mono? Aquí el código: http://pastebin.com/u5UatPN8

Si os fijáis en la parte inferior, ahora debería anidar un montón de elif (tantos como comandos tenga el bot). Me resulta visualmente muy feo, a parte de poco práctico. Hay alguna forma más correcta de hacer lo mismo?

Por otra parte, como podría validad cada palabra de un string? Actualmente miro si "poweroff" está en el tweet, pero me gustaría poder validad la primera palabra, luego la segunda, etc... ya que habrán comandos que tendrán parámetros, por ejemplo:

@tweetbotRpi poweroff 23:00

Como podría en python validad que el comando es "poweroff" y a la vez coger el "23:00" para usarlo como argumento? En bash sería usando $1, $2, $3, $n... pero en python?

Gracias! :)

E
def func1:
    print "Func1"

def func2:
    print "Func2"

def funcN:
    print "FuncN"

def defaultFunc:
    print "Default func"

try:
    ({'1': func1, '2': func2, 'N', funcN}[var])()
except KeyError:
    defaultFunc()
ciza

Usa un diccionario, que retorne valores, o llame a distintas funciones o lo que sea

def f(x):
    return {
        'a': 1,
        'b': 2,
    }[x]

O hay gente que quiere seguir teniendo la misma sintaxis que se crea clases custom

2 1 respuesta
HeXaN

¿Y por qué no aprendes primero las bases y luego te metes a hacer el bot?

3 2 respuestas
AikonCWD

#4 Creo que las bases de programación las tengo muy muy asumidas, sé programar y sé que tengo que hacer para cumplir un objetivo.

Usar un lenguaje u otro, una sintaxis u otra son cosas que suelo aprender sobre la marcha. A mi me hace gracia la gente que dice "se programar en C, vb, python y java", wtf? O sabes programar o no sabes... el lenguaje o la sintaxis que uses no tiene nada que ver en saber programar o no. Lo dicho, cuando me meto a programar algo, la sintaxis la voy aprendiendo sobre la marcha, siempre lo hago así y me va bien (hasta hoy, que jamás había tocado un lenguaje sin switch implementado xD).

Volviendo al tema; he entendido como hacerlo con listas (gracias!), pero no se, visualmente me resulta horrible, en fin, tendré que pasar por el aro.

Gracias!

3 respuestas
m4andg4

#5 La alternativa de #3 es magra visualmente hablando, y muy parecido a un switch de toda la vida.

1
DarkSoldier

#5 si supieras programar lo harías con polimorfismo /cc #4

1 respuesta
HeXaN

#7 ¿Pero no quedamos en que los polimorfismos eran para quitar los "ifs"?

1 respuesta
DarkSoldier

#8 y lo que intenta hacer que es?

1 respuesta
B

#5 Pues para saber programar, no sabes resolver el problema que planteas.

Mi recomendacion, leete Object-Oriented Design Heuristics.

3 2 respuestas
DarkSoldier

#10 hijo de la grandisima puta XDDDDDDDDDDDDDDDDDDDDDDDDDDD

#10R1kz:

Mi recomendacion, leete Object-Oriented Design Heuristics.

CASI!!

B

dios santo menuda ca;a le meteis al pobre xD

1 respuesta
E

#12 aquí le llueve mierda a todo el mundo, y porque no estás en el grupo de TG, que si no a tí también te caía xDDDD

AikonCWD

#10 Claro que lo se resolver, solo preguntaba si habia una forma más correcta o elegante que no anidar varios if para hacer un switch. Troll

1 respuesta
B

Un día de estos abro un hilo con dudas de golang y a ver quien tiene cojones de recomendarme el "Object-Oriented Design Heuristics" .
#14 https://docs.python.org/2/faq/design.html#why-isn-t-there-a-switch-or-case-statement-in-python

2 respuestas
B

abrelo ahora anda

m4andg4

#6 what?

HeXaN

#15 El putaso de #9 te lo recomienda en cuanto vea el hilo abierto.

1 respuesta
Vashealer

los switch cases son un nido de bugs, mappear en un dict las acciones es una solución a tu problema

por otra parte, usando input.split() devuelves una lista con las palabras de un texto ( por defecto el delimitador es " ") y luego tendrías en cada elemento de la lista tu $1, $2, $3...

más info :

spoiler

si no sabes buscar eso en python, no sé a qué te refieres con saber programar

saludos

B

#18 Pues ya hay que tener cojones si me lo recomienda para un lenguaje NO ORIENTADO A OBJETOS ( ni a amuletos de d3).

2 respuestas
HeXaN

#20 Ya sabes, tú abre un hilo de Go y yo otro sobre cómo usar una casa de subastas. Los dos salimos ganando.

DarkSoldier

#20 ni puto caso a los retrasados estos XDDD que puedes esperar de una persona que hace poco me ha dicho: "Recomiendame algún libro para aprender node"

Amazon

En una kata aqui de mv descubrí lo del diccionario y la verdad que mano de santo

Kaiserlau
def print_lol(*args):
    print('lol')

def tdspts(string):
    print ('menos mi %s'%(string))

def dosanos(*args):
    print ('me duele el culo pero no se en que agujero')


x = 'novia'
commands = {}
commands['lol'] = print_lol
commands['tdspts'] = tdspts
commands['pfpfpf'] = dosanos

def retard_conTROLer(algo):
    query = algo.split()
    for items in query:
        if items in commands:
            commands[items](x)

easy, se puede hacer de muchisimas maneras xD

1 respuesta
DarkSoldier

#24 https://github.com/OscarGalindo/nerdo2bot/blob/master/src/domain/bot.ts#L24-L35

#1 aqui tienes un bot que hice para irc, alomejor puedes sacar ideas https://github.com/OscarGalindo/nerdo2bot/

1 respuesta
Kaiserlau

#25

retard_conTROLer('pfpfpf a mi q me cuentas saludos xdxd')
B

#15 Struct-Oriented Design Heuristics

Saludos y de nada

Fosht

Hazte un Factory que al pasarle el nombre del comando te devuelva una nueva instancia de una clase que lo pueda interpretar.

EG:

# instancia tu factory por aqui

#el siguiente paso lo podrías meter en un try catch para capturar si la clase no existe (comando no existe)
command_handler = factory.get_command_handler("poweroff")
#en este punto podrias setearle dependencias, o pasarselas al factory y que este se la pase al command handler.
command_handler.handle()

Usuarios habituales