Comment mettre en œuvre __iter__(self) pour un conteneur d'objet (Python)
J'ai écrit un conteneur personnalisé objet.
Selon cette page, j'ai besoin de mettre en œuvre cette méthode sur mon objet:
__iter__(self)
Cependant, en suivant le lien vers Types Iterator dans le Python manuel de référence, il n'existe pas d'exemples de comment implémenter votre propre.
Quelqu'un peut poster un extrait de code (ou un lien vers une ressource), qui montre comment faire cela?
Le conteneur je suis en train d'écrire, est une carte (c'est à dire des magasins de valeurs de clés uniques).
dicts peut être itéré comme ceci:
for k, v in mydict.items()
Dans ce cas j'ai besoin d'être en mesure de retourner deux éléments (un tuple?) dans l'itérateur.
Il n'est pas encore clair comment mettre en œuvre un itérateur (malgré les quelques réponses qui ont été aimablement fournie). Quelqu'un pourrait s'il vous plaît faire plus de lumière sur la façon de mettre en œuvre un itérateur sur une carte comme objet de conteneur? (c'est à dire une classe personnalisée qui agit comme un dict)?
Vous devez vous connecter pour publier un commentaire.
Normalement, je voudrais utiliser un générateur de fonction. Chaque fois que vous utilisez une instruction rendement, il sera l'ajout d'un élément de la séquence.
La suite de créer un itérateur qui renvoie cinq, et ensuite, tous les éléments dans some_list.
Pré-3.3,
yield from
n'existe pas, de sorte que vous avez à faire:some_list
ont été donné.some_list
est épuisé.StopIteration
est automatiquement soulevé par Python lorsque le générateur de fonction retourne une valeur, soit en vous appelant explicitementreturn
ou en atteignant la fin de la fonction (qui, comme toutes les fonctions implicitereturn None
à la fin). Explicitement éleverStopIteration
n'est pas nécessaire et que de Python 3.5 y aura effectivement pas de travail (voir la section PEP 479): tout comme les générateurs de tournerreturn
enStopIteration
, ils se tournent expliciteraise StopIteration
dans unRuntimeError
.Une autre option est d'hériter de la classe de base abstraite de la " collections module comme indiqué ici.
Dans le cas où le conteneur est son propre itérateur, vous pouvez hériter de
collections.Iterator
. Vous avez seulement besoin de mettre en œuvre lesnext
méthode, puis.En est un exemple:
Pendant que vous êtes à la recherche à la
collections
module, pensez à hériter deSequence
,Mapping
ou d'une autre classe de base abstraite si cela est plus approprié. Voici un exemple pour unSequence
sous-classe:NB: Grâce à Glenn Maynard pour attiré mon attention sur la nécessité de clarifier la différence entre les itérateurs, d'une part, et les conteneurs qui sont iterables plutôt que de les itérateurs sur les autres.
généralement
__iter__()
juste retour de l'auto si vous avez déjà définir la méthode next () (générateur d'objet):ici est un Mannequin exemple d'un générateur :
mais
__iter__()
peut également être utilisé comme ceci:http://mail.python.org/pipermail/tutor/2006-January/044455.html
Si votre objet contient un ensemble de données que vous voulez lier votre objet iter, vous pouvez tricher et de faire cela:
hasattr
, utiliseztry/except AttributeError
La "itératif" interface en python se compose de deux méthodes
__next__()
et__iter__()
. Le__next__
de la fonction est le plus important, car il définit l'itérateur de comportement - qui est, la fonction détermine quelle valeur doit être retourné suivant. Le__iter__()
méthode est utilisée pour réinitialiser le point de départ de l'itération. Souvent, vous trouverez que__iter__()
pouvez simplement retourner auto quand__init__()
est utilisé pour définir le point de départ.Voir le code suivant pour définir une Classe Inversée qui met en place la "itératif" interface " et définit un itérateur sur toute instance à partir d'une séquence de classe. Le
__next__()
méthode commence à la fin de la séquence et retourne les valeurs dans l'ordre inverse de la séquence. Notez que les instances d'une classe de mise en œuvre de la "séquence" d'interface doit définir un__len__()
et un__getitem__()
méthode.Pour répondre à la question sur mappages: votre condition
__iter__
doit effectuer une itération sur les clés de la cartographie. Le suivant est un exemple simple qui crée un mappagex -> x * x
et travaille sur Python3 l'extension de l'ABC de la cartographie.Dans le cas où vous ne voulez pas hériter de
dict
comme d'autres l'ont suggéré, ici est la réponse directe à la question sur la façon de mettre en œuvre__iter__
pour un exemple brut d'une coutume dict:Qui utilise un générateur, qui est bien décrite ici.
Puisque nous allons hériter de
Mapping
, vous devez également mettre en œuvre__getitem__
et__len__
:Une option qui pourrait fonctionner pour certains cas, est de faire de votre classe personnalisée hériter de
dict
. Cela semble être un choix logique si il agit comme un dict; peut-être qu'il devrait être un dict. De cette façon, vous obtenez dict-comme d'itération pour gratuit.De sortie:
exemple pour inhert de dict, de modifier ses
iter
, par exemple, ignorer clé2
quand en boucle