w3schools method iter for files __iter__ python iterator

method - ¿Cómo puedo verificar si un objeto es un iterador en Python?



python itertools (4)

Puedo verificar el método next() , pero ¿es suficiente? ¿Hay una manera ideomática?


En Python 2.6 o superior, el lenguaje diseñado para tales verificaciones de comportamiento es una "verificación de membresía" con la clase base abstracta en el módulo de collections de la biblioteca estándar:

>>> import collections >>> isinstance(''ciao'', collections.Iterable) True >>> isinstance(23, collections.Iterable) False >>> isinstance(xrange(23), collections.Iterable) True

De hecho, este tipo de comprobaciones es la principal razón de diseño para las nuevas clases base abstractas (una segunda importante es proporcionar "funcionalidad mixin" en algunos casos, por lo que son ABC y no solo interfaces, pero eso no significa nada). Se aplica a las collections.Iterable . issubclass , existe estrictamente para permitir tales comprobaciones con isinstance o issubclass ). Los ABCs permiten que las clases que en realidad no los heredan se "registren" como subclases de todos modos, de modo que dichas clases puedan ser "subclases" del ABC para tales verificaciones; y pueden realizar internamente todas las comprobaciones necesarias para métodos especiales ( __iter__ en este caso), por lo que no tiene que hacerlo.

Si estás atascado con versiones anteriores de Python, "es mejor pedir perdón que permiso":

def isiterable(x): try: iter(x) except TypeError: return False else: return True

pero eso no es tan rápido y conciso como el nuevo enfoque.

Tenga en cuenta que, para este caso especial, a menudo querrá cadenas de casos especiales (que son iterables, pero la mayoría de los contextos de aplicación quieren ser tratados como "escalares"). Cualquiera que sea el método que esté utilizando para verificar la viabilidad, si necesita una carcasa tan especial, simplemente prepague un cheque para su isinstance(x, basestring) , por ejemplo:

def reallyiterable(x): return not isinstance(x, basestring) and isinstance(x, collections.Iterable)

Edición : como se señaló en un comentario, la pregunta se centra en si un objeto es un iter *** ator *** en lugar de si es iter *** able *** (todos los iteradores son iterables, pero no al revés - No todos los iterables son iteradores). isinstance(x, collections.Iterator) es la forma perfectamente análoga de verificar esa condición específicamente.


Para ser un iterador, un objeto debe pasar tres pruebas:

  • obj tiene un método __iter__
  • obj tiene un método next (o __next__ en Python 3)
  • obj.__iter__() devuelve obj

Por lo tanto, una prueba de roll-your-own se vería como:

def is_iterator(obj): if ( hasattr(obj, ''__iter__'') and hasattr(obj, ''next'') and # or __next__ in Python 3 callable(obj.__iter__) and obj.__iter__() is obj ): return True else: return False


Un objeto es iterable si implementa el protocolo iterador.
Puede verificar la presencia del __iter__() con:

hasattr(object,''__iter__'')

en Python 2.x este enfoque omite los objetos str y otros tipos de secuencia incorporados como Unicode, xrange, buffer. Funciona en Python 3.

Otra forma es probarlo con el método iter:

try: iter(object) except TypeError: #not iterable


respuesta de Python sourcecode doc comentarios:

{ruta de instalación de python} /Versions/3.5/lib/python3.5/types.py

# Iterators in Python aren''t a matter of type but of protocol. A large # and changing number of builtin types implement *some* flavor of # iterator. Don''t check the type! Use hasattr to check for both # "__iter__" and "__next__" attributes instead.