Duck Typing en Python – 3 Ejemplos prácticos

Ejemplos prácticos

En Python, la iteración nos permite repasar una lista de elementos para realizar operaciones particulares. Una forma común de crear una iteración es usar los bucles for, que tienen el siguiente formato general.

for i in iterable:
expression

Como comenté en mi artículo anterior, podemos crear nuestros iteradores personalizados que se pueden usar como iterables en los bucles for. Para satisfacer las «pruebas de pato» para iteradores, la clase personalizada necesita implementar los métodos __iter__() y __next__(). A continuación se da un ejemplo específico.

Escribir en Iteradores

En el fragmento de código anterior, implementamos métodos __iter__() y __next__() que hacen que las instancias de la clase personalizada Cubes sean iteradores, de modo que la instancia se pueda usar en un bucle for.

Callables

Además del tipo de datos dict incorporado, otro tipo de diccionario importante es defaultdict, disponible en el módulo collections. Este tipo de datos tipo diccionario tiene el siguiente constructor: defaultdict(]). Específicamente, el argumento default_factory es un tipo de invocable, como una función o una función lambda.

En mi artículo anterior, mostré que podíamos utilizar defaultdict pasando una función lambda. Este es el ejemplo de su uso.

>>> from collections import defaultdict
>>> letter_counts = defaultdict(lambda: 0)
>>> for i in 'abcddddeeeee':
... letter_counts += 1
...
>>> letter_counts.items()
dict_items()

Notablemente, podemos tener una mejor flexibilidad para usar el tipo de datos defaultdict si creamos nuestra propia fábrica predeterminada. Con la filosofía «duck typing», la clase personalizada necesita implementar el método __call__(), que es hacer que algo se pueda llamar. Veamos cómo funciona.

Pato Escribiendo en Callables

Como se muestra en el código anterior, creamos la clase DucklingFactory, cuya función __call__() devuelve una lista de una instancia Duckling. Usando esta función de fábrica, podremos hacer el número deseado de patitos multiplicando la lista de patitos predeterminada.

Ordenar con Len ()

Otro uso posible de duck typing es implementar la función personalizada len(), que se puede usar para ordenar una lista usando la función sort(). Como nota al margen, algunas personas se refieren a la función len() como una función mágica, porque se implementa llamando a la función __len__() detrás de escena (las funciones con guiones bajos dobles como prefijo y sufijo se llaman funciones mágicas).

Supongamos que queremos ordenar una lista de patos en función de la longitud del nombre de cada pato. Así es como podemos aplicar el tipado de pato en este caso.

Escribir en Orden

En el fragmento de código anterior, la clase personalizada NamedDuck implementa las funciones __str__() y __len__(), que nos permiten usar las funciones str() y len() en sus instancias en las Líneas 10 y 12, respectivamente. Es importante destacar que, como puede ver, aunque la lista está mezclada con patos y cadenas con nombre, todos los elementos pueden llamar a las funciones str() y len(), de modo que la lista se puede ordenar usando la tecla len() y se puede usar en la comprensión de la lista cuando queremos imprimir el resultado ordenado.

Por lo tanto, la implicación más amplia de este uso es que cuando tenemos una lista mixta de elementos de diferentes tipos de datos, siempre y cuando cada tipo de datos implemente las mismas funciones, los elementos pasarán la prueba de pato y se aplicarán con las operaciones adecuadas. Este es un ejemplo de caso de uso general que usa la función len () en una lista mixta de tipos de datos de str, tuple y list.

>>> mixed_list = ]
>>> mixed_list.sort(key=len)
>>> mixed_list
, (1, 2), 'Amazing']

You might also like

Deja una respuesta

Tu dirección de correo electrónico no será publicada.