Duck Typing en Python – 3 Exemples pratiques

Exemples pratiques

En Python, l’itération nous permet de parcourir une liste d’éléments pour effectuer des opérations particulières. Une façon courante de créer une itération consiste à utiliser les boucles for, qui ont le format général suivant.

for i in iterable:
expression

Comme discuté dans mon article précédent, nous pouvons créer nos itérateurs personnalisés qui peuvent être utilisés comme itérables dans les boucles for. Pour satisfaire le « test de canard » pour les itérateurs, la classe personnalisée doit implémenter les méthodes __iter__() et __next__(). Un exemple spécifique est donné ci-dessous.

Saisie de canard dans les itérateurs

Dans l’extrait de code ci-dessus, nous avons implémenté les méthodes __iter__() et __next__() qui rendent les instances de la classe personnalisée Cubes itérateurs, de sorte que l’instance puisse être utilisée dans une boucle for.

Appelables

Outre le type de données intégré dict, un autre type de dictionnaire important est defaultdict, disponible dans le module collections. Ce type de données de type dictionnaire a le constructeur suivant : defaultdict(]). Plus précisément, l’argument default_factory est un type d’appelable, tel qu’une fonction ou une fonction lambda.

Dans mon article précédent, j’ai montré que nous pouvions utiliser le defaultdict en passant une fonction lambda. Voici l’exemple de son utilisation.

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

Notamment, nous pouvons avoir une meilleure flexibilité pour utiliser le type de données defaultdict si nous créons notre propre usine par défaut. Avec la philosophie « duck typing », la classe personnalisée doit implémenter la méthode __call__(), qui consiste à rendre quelque chose appelable. Voyons comment ça marche.

Duck Tapant dans les Appelables

Comme indiqué dans le code ci-dessus, nous créons la classe DucklingFactory, dont la fonction __call__() renvoie une liste d’une instance Duckling. En utilisant cette fonction d’usine, nous pourrons créer le nombre de canetons souhaité en multipliant la liste de canetons par défaut.

Tri Avec Len()

Une autre utilisation possible du typage canard consiste à implémenter la fonction personnalisée len(), qui peut être utilisée pour trier une liste à l’aide de la fonction sort(). En guise de remarque, certaines personnes se réfèrent à la fonction len() comme une fonction magique, car elle est implémentée en appelant la fonction __len__() en arrière-scène (ces fonctions avec des doubles traits de soulignement comme préfixe et suffixe sont appelées fonctions magiques).

Supposons que nous souhaitions trier une liste de canards en fonction de la longueur du nom de chaque canard. Voici comment nous pouvons appliquer le typage de canard dans ce cas.

Duck Typing dans le tri

Dans l’extrait de code ci-dessus, la classe custom NamedDuck implémente les fonctions __str__() et __len__(), qui nous permettent d’utiliser les fonctions str() et len() sur ses instances des lignes 10 et 12, respectivement. Fait important, comme vous pouvez le voir, bien que la liste soit mélangée avec des canards et des chaînes nommés, tous les éléments peuvent appeler les fonctions str() et len(), de sorte que la liste peut être triée en utilisant la len() comme clé et utilisée dans la compréhension de la liste lorsque nous voulons imprimer le résultat trié.

Ainsi, l’implication plus large de cette utilisation est que lorsque nous avons une liste mixte d’éléments de différents types de données, tant que chaque type de données implémente les mêmes fonctions, les éléments passeront le test de canard et seront appliqués avec les opérations appropriées. Voici un exemple de cas d’utilisation général utilisant la fonction len() sur une liste mixte de types de données str, tuple et list.

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

You might also like

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.