Puedo verificar el método next()
, pero ¿es eso suficiente? ¿Hay una forma ideomática?¿Cómo puedo verificar si un objeto es un iterador en Python?
Respuesta
En Python 2.6 o mejor, el lenguaje diseñada-in para estos controles de comportamiento es una "verificación de la pertenencia" con el clase base abstracta en el módulo 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 controles es la razón fundamental del diseño de las nuevas clases de base abstracta (un segundo importante es proporcionar "funcionalidad mixin" de alguna casos, que es por eso que son ABCth rath Más que solo interfaces, pero eso no se aplica a collections.Iterable
, existe estrictamente para permitir tales controles con isinstance
o issubclass
). Los ABC permiten que las clases que realmente no heredan de ellos se "registren" como subclases de todos modos, de modo que dichas clases puedan ser "subclases" del ABC para dichas verificaciones; y, pueden realizar internamente todas las comprobaciones necesarias para métodos especiales (__iter__
en este caso), por lo que no es necesario.
Si le pegan con versiones anteriores de Python, "es mejor pedir perdón que pedir permiso":
def isiterable(x):
try: iter(x)
except TypeError: return False
else: return True
pero eso no es tan rápida y concisa 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 desea tratar como "escalares" de todos modos). Independientemente del enfoque que utiliza para comprobar iterableness, si usted necesita tal carcasa especial simplemente escriba un cheque por isinstance(x, basestring)
- por ejemplo:
def reallyiterable(x):
return not isinstance(x, basestring) and isinstance(x, collections.Iterable)
Editar: como se señala en un comentario, la cuestión se centra en si un objeto es un iter *** ator *** en lugar de si iter *** able *** (todos los iteradores son iterables, pero no al revés - no todos los iterables son iteradores). isinstance(x, collections.Iterator)
es la manera perfectamente análoga de verificar específicamente esa condición.
Un objeto es iterable si implementa el protocolo de iterador.
Usted puede comprobar la presencia de __iter__()
método con:
hasattr(object,'__iter__')
en Python 2.x este enfoque no encuentra objetos str y otros tipos de secuencias integradas como Unicode, xrange, tampón. Funciona en Python 3.
Otra forma es poner a prueba con el método iter:
try:
iter(object)
except TypeError:
#not iterable
Crear un iterador puede ser costoso, mientras que verificar la existencia del atributo siempre es * rápido *. –
Para ser un iterador un objeto debe pasar tres pruebas:
obj
tiene un método__iter__
obj
tiene un métodonext
(o__next__
en Python 3)obj.__iter__()
rendimientosobj
Por lo tanto, una prueba de rollo propio parecerse a:
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
¿Llamar a 'obj .__ iter __()' corre el riesgo de cambiar algo? –
@ BobStein-VisiBone: solo si el objeto tiene errores. –
- 1. python 3: cómo verificar si un objeto es una función?
- 2. ¿Cómo verificar si un objeto es convertible a otro tipo?
- 3. ¿Cómo puedo verificar si se lanza un objeto?
- 4. ¿Cómo puedo verificar si un valor es un número?
- 5. ¿Cómo verificar si un objeto está definido?
- 6. ¿Cómo comprobar si un objeto es un objeto generador en python?
- 7. ¿Cómo puedo verificar si una variable es un objeto jQuery o un elemento DOM simple?
- 8. ¿Cómo puedo verificar si un objeto es nulo en ruby on rails 2?
- 9. ¿Cómo puedo verificar si existe un objeto en un determinado índice de un NSMutableArray?
- 10. Python: determinar si un objeto es similar a un archivo
- 11. ¿Cómo puedo verificar si un identificador de MATLAB es válido?
- 12. cómo detectar si un tipo es un iterador o const_iterator
- 13. ¿Cómo puedo verificar si existe un directorio?
- 14. ¿Cómo comprobar si un objeto es iterable en Python?
- 15. ¿Cómo puedo verificar si un entero con signo es positivo?
- 16. ¿Cómo puedo verificar si un gráfico dirigido es acíclico?
- 17. ¿cómo puedo verificar si existe un archivo?
- 18. ¿Cómo puedo verificar si una URL es absoluta usando Python?
- 19. ¿Cómo puedo verificar si puedo llamar a host() en un objeto URI en Perl?
- 20. ¿Cómo puedo verificar si existe un procedimiento en un paquete?
- 21. ¿Debo verificar si un objeto es nulo primero o segundo?
- 22. ¿Cómo puedo verificar si un JSON está vacío en NodeJS?
- 23. ¿Cómo puedo verificar si existe un grupo con nombre en un objeto MatchData?
- 24. ¿Puedo verificar si un objeto es una especie de clase específica, en PHP?
- 25. En caso de que un objeto implemente un iterador u otro objeto que implemente un iterador
- 26. ¿Hay alguna forma común de verificar en Python si un objeto es cualquier tipo de función?
- 27. ¿Cómo saber si un objeto es un objeto RegExp?
- 28. KVO - ¿Cómo comprobar si un objeto es un observador?
- 29. ¿Por qué no puedo verificar si un 'DateTime' es 'Nothing'?
- 30. ¿Cómo puedo verificar si existe un archivo en Perl?
Las preguntas se preguntan si un objeto es un iterador, no si es iterable. Por lo tanto, debe usar colecciones. Identificador en lugar de colecciones. Es posible –
@Dave, derecha, déjeme editar para aclarar. –