¿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 
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...
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..
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
¡mamá, ya entendí el chiste!
Palabras clave: cuac, duck typing, ducktyping, python

Comentarios