Comment déléguer l’itération en Python

Vous avez créé un objet conteneur personnalisé qui contient en interne une liste, un n-uplet ou un autre objet itérable. Vous souhaitez faire fonctionner l’itération avec votre nouveau conteneur.

Typiquement, tout ce que vous avez à faire est de définir une méthode __iter__() qui délègue l’itération au conteneur interne. Par exemple:

class Noeud:
    def __init__(self, valeur):
        self._valeur = valeur
        self._enfants = []

    def __repr__(self):
        return 'Noeud({!r})'.format(self._valeur)

    def ajouter_enfant(self, Noeud):
        self._enfants.append(Noeud)

    def __iter__(self):
        return iter(self._enfants)

# Exemple
if __name__ == '__main__':
    racine = Noeud(0)
    enfant1 = Noeud(1)
    enfant2 = Noeud(2)
    racine.ajouter_enfant(enfant1)
    racine.ajouter_enfant(enfant2)
    for ch in racine:
        print(ch)
    # Sortie: Noeud(1), Noeud(2)

 

Dans ce code, la méthode __iter__() transmet tout simplement la demande d’itération à l’attribut _enfants détenu en interne.

Le protocole d’itération de Python nécessite que la méthode __iter__() retourne un objet d’itération spécial qui implémente une méthode __next__() pour effectuer l’itération réelle.

Si vous ne faites qu’itérer le contenu d’un autre conteneur, vous n’avez pas vraiment besoin de vous soucier des détails sous-jacents de son fonctionnement. Tout ce que vous avez à faire est de transférer la demande d’itération.

L’utilisation de la fonction iter() est ici un raccourci qui nettoie le code. iter(s) retourne simplement l’itérateur sous-jacent en appelant s.__iter__(), un peu de la même manière que len(s) invoque s.__len__().

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here