Comment puis-je vérifier si un objet est un itérateur en Python?
Je peux vérifier pour un next()
méthode, mais est-ce suffisant? Est-il un ideomatic façon?
Vous devez vous connecter pour publier un commentaire.
Je peux vérifier pour un next()
méthode, mais est-ce suffisant? Est-il un ideomatic façon?
Vous devez vous connecter pour publier un commentaire.
En Python 2.6 ou mieux, de la conçu, dans l'idiome de ces contrôles comportementaux est une "adhésion cochez la case" avec la classe de base abstraite dans le
collections
des modules de la bibliothèque standard:En effet, ce type de contrôles est la principale raison de la conception pour les nouvelles classes de base abstraites (un deuxième point important est à fournir "mixin fonctionnalité" dans certains cas, ce qui est pourquoi ils sont Bruns plutôt que de simplement les interfaces -- mais qui ne s'applique pas à
collections.Iterable
, il existe strictement pour permettre à de telles vérifications avecisinstance
ouissubclass
). Abc permettent à des classes qui n'ont pas hériter de leur être "enregistré" en tant que sous-classes de toute façon, de sorte que ces classes peuvent être "sous-classes" de l'ABC pour ces vérifications; et, ils peuvent en interne d'effectuer tous les contrôles nécessaires pour les méthodes spéciales (__iter__
dans ce cas), de sorte que vous n'avez pas à.Si vous êtes coincé avec les anciennes versions de Python, "il vaut mieux demander pardon que la permission":
mais ce n'est pas aussi rapide et concise que la nouvelle approche.
Noter que pour ce cas spécial, vous voudrez souvent spéciales aux chaînes de caractères (qui sont itérable, mais la plupart des contextes applicatifs envie de le traiter comme "scalaires" de toute façon). Quelle que soit l'approche que vous utilisez pour vérifier iterableness, si vous avez besoin d'un tel revêtement spécial, juste ajouter une case pour
isinstance(x, basestring)
, par exemple:Modifier: comme l'a souligné dans un commentaire, la question se concentre sur la question de savoir si un objet est une iter***ateu r*** plutôt que de savoir si c'est iter***pu*** (tous les itérateurs sont itératif, mais pas vice-versa, pas tous iterables sont les itérateurs).
isinstance(x, collections.Iterator)
est la perfection de manière analogue, la vérification de cette condition en particulier.collections.Iterator
sera plutôtcollections.abc.Iterator
. Python 3.7 émet un warning de dépréciation pour cela: "l'Aide ou de l'importation de l'Abc à partir de "collections" à la place de leurs collections.abc' est obsolète, et à 3,8 elle va arrêter de travailler".[]
est itératif, mais il n'est pas un itérateur.Un objet itérable si elle implémente l'itérateur protocole.
Vous pouvez vérifier la présence de
__iter__()
méthode:en Python 2.x, cette approche manque str objets et d'autres intégrés dans la séquence des types comme unicode, xrange, tampon. Il fonctionne en Python 3.
Une autre façon est de le tester avec iter méthode :
Être un itérateur un objet doit passer trois épreuves:
obj
a un__iter__
méthodeobj
a unnext
de la méthode (ou__next__
en Python 3)obj.__iter__()
retourneobj
Donc, d'un roll-votre-propre test ressemblerait à:
obj.__iter__()
courir le risque de changer quelque chose?obj
est un itérateur, alors oui, il ne faut pas changer quelque chose. Mais siobj
n'est pas un itérateur,obj.__iter__()
est autorisé à avoir des effets secondaires.obj
en question n'est pas, en fait, un itérateur alors ma réponse à lui ne s'applique pas.hasattr([1,2,3], '__next__') == False
, maishasattr([1,2,3], '__iter__') == True
réponse de python code source doc commentaires:
{installer python path}/Versions/3.5/lib/python3.5/types.py
Que la question est à propos d'Itérateur pas Itérable et compte tenu de l'utilisation de l'itérateur, la plus simple et pythonic façon de le faire
Oui. La vérification sur next() devrait être assez
Il y a une meilleure méthode que d'autres réponses ont suggéré.
En Python, nous avons deux sortes de choses:
Iterable
etIterator
. Un objet estIterable
s'il peut vous donnerIterator
. Il le fait lorsque vous utiliseziter()
sur elle. Un objet estIterator
si vous pouvez utilisernext()
de façon séquentielle de parcourir à travers ses éléments. Par exemple,map()
retourneIterator
etlist
estIterable
.Voici plus de détails.
Code ci-dessous illustre comment vérifier ces types:
Cet exemple est tiré du livre Efficace Python et est illustré dans cette post.