Ingresar:

Rho :: Blog :: El chiste del animal que grazna, camina y actua como un pato...

May 14, 2008

user icon
Rho

¿escucharon ese chiste?

"Si camina como pato, hae quack como pato... es un pato"

Se refiere al famoso Duck Typing, según la wikipedia:

In computer programming, duck typing is a style of dynamic typing in which an object's current set of methods and properties determines the valid semantics, rather than its inheritance from a particular class. 

Hace años que lo leí la primera vez... pero recién lo entendí hace unas semanas en una presentación de Ernesto, dondé simplemente repitió lo mismo -más o menos palabras-.

Siempre me pareció chistoso el duck typing, pero ahora que lo entendió me da más risa Laughing

Practicamente es suficiente añadir los métodos necesarios a una clase/objeto para que soporte cierto comportamiento. En python todo puede parecer un pato... Tongue out seguramente en cualquier lenguaje dinámico

Por ejemplo, la método para order algún lugar

  def ordenar(lugar):       """       Mi algoritmo para order cosas       """       print '[+] ordenando %s' % lugar       for cosa in lugar:  # lugar puede ser una lista           print 'encontrado: %s' % cosa           if cosa.sirve:               if cosa.esta_sucio:                   print '\tlimpiando: %s' % cosa                   limpiar(cosa)               if cosa.es_importante:                   if cosa.tiene_lugar:                       print '\tponiendo en su lugar: %s' % cosa                       poner_en_su_lugar(cosa)                   else:                       print '\tguardando: %s' % cosa                       guardar(cosa)               else:                   print '\ta algún rincón: %s' % cosa                   poner_en_un_rincon(cosa)           else:               print '\tal basurero:', cosa               al_basurero(cosa)    

luego tengo objetos que pueden estar en algun lugar:

 
class MiLibro(Libro):
 
    titulo = 'Duck Typing Redux'
 
    autor = 'Rho'
 
    # tambien puedo ser cadena
 
    def __str__(self):
 
        return 'Libro "%s"' % self.titulo
 
class Donald(Pato):
 
    nombre = 'Donald'
 
    def __str__(self):
 
        return 'Pato Donald'
 
class Rho(Persona):
 
    nombre = 'Rolando'
 
    # print yo
 
    def __str__(self):
 
        return '%s' % self.nombre
 
 
 

Ahora podemos tener nuestros objetos:

  libro = MiLibro()   pato = Donald()   rho = Rho()     

Pero ninguno es una "cosa" ordenable, según los métodos/propiedades que necesita la función ordenar.

¿qué hacemos?

Pues enseñamos a nuestros objectos a ser "ordenables", o a decir ¡cuac! 

  # enseñando a ser "pato"   libro.sirve = True   libro.esta_sucio = True   libro.es_importante = True   libro.tiene_lugar = True   # pato patito   pato.sirve = True   pato.esta_sucio = True   pato.es_importante = False   # self   rho.sirve = False     

Pero necesito un lugar que contenga las cosas, podría ser una simple lista pero quiero definir mi sala:

   class MiSala(Sala):       lugar = 'casa'       cosas = []     # lista de cosas       def __iter__(self):           # nuestra sala es "iterable" (generator rulz!)             return (cosa for cosa in self.cosas)       def __str__(self):           return 'sala en %s' % self.lugar     

Luego añado mis "cosas" a mi sala iterable.. Tongue out

y al final lanzo ejecuto ordenar() sobre mi sala 

  # mi sala con cosas   misala = MiSala()   misala.cosas.append(libro)   misala.cosas.append(pato)   misala.cosas.append(rho)   # ordenar todo   ordenar(misala)    

Este es el resultado:

 
rolando@rhotergeist:~$ python ducktyping.py
 
[+] ordenando sala en casa
 
encontrado: Libro "Duck Typing Redux"
 
    limpiando: Libro "Duck Typing Redux"
 
    poniendo en su lugar: Libro "Duck Typing Redux"
 
encontrado: Pato Donald
 
    limpiando: Pato Donald
 
    a algún rincón: Pato Donald
 
encontrado: Rolando
 
    al basurero: Rolando
 
 

¿fácil, no?

Moraleja: para pasar por pato sólo tienes que decir cuac y caminar como pato Laughing

¡mamá, ya entendí el chiste! 

Palabras clave: cuac, duck typing, ducktyping, python

Enviado por Rho



Comentarios

  1. El código del ejemplo: http://ajayu.memi.umss.edu.bo/rho/files/-1/403/ducktyping.py

    user iconRho on Wednesday, 14 May 2008, 15:30 BOT # |

Debes iniciar sesión para enviar un comentario.