Posso verificare un metodo next()
, ma è sufficiente? Esiste un modo ideologico?Come posso verificare se un oggetto è un iteratore in Python?
risposta
In Python 2.6 o meglio, l'idioma progettato a tali controlli comportamentali è un "controllo di appartenenza" con il classe di base astratta nel modulo collections
della libreria standard:
>>> import collections
>>> isinstance('ciao', collections.Iterable)
True
>>> isinstance(23, collections.Iterable)
False
>>> isinstance(xrange(23), collections.Iterable)
True
in effetti, questo tipo di controlli è la ragione di progettazione principale per le nuove classi di base astratta (un secondo importante è quello di fornire "la funzionalità mixin" in qualche casi, che è il motivo per cui sono ABC rath er che solo le interfacce - ma non si applica a collections.Iterable
, esiste rigorosamente per consentire tali controlli con isinstance
o issubclass
). Gli ABC consentono alle classi che in realtà non ereditano da loro di essere "registrate" come sottoclassi in ogni caso, così che tali classi possano essere "sottoclassi" dell'ABC per tali controlli; e, in questo caso, possono eseguire internamente tutti i controlli necessari per i metodi speciali (__iter__
), quindi non è necessario.
Se sei bloccato con vecchie versioni di Python, "è meglio chiedere perdono che il permesso":
def isiterable(x):
try: iter(x)
except TypeError: return False
else: return True
ma che non è il più veloce e conciso come il nuovo approccio.
Si noti che per questo caso particolare spesso si vogliono stringhe di casi speciali (che sono iterabili ma la maggior parte dei contesti applicativi vuole trattare come "scalari" comunque). Qualunque sia l'approccio che si sta utilizzando per controllare iterableness, se avete bisogno di tale involucro speciale solo anteporre un assegno per isinstance(x, basestring)
- ad esempio:
def reallyiterable(x):
return not isinstance(x, basestring) and isinstance(x, collections.Iterable)
Edit: come sottolineato in un commento, la questione si concentra sul fatto che un oggetto è un iter *** ator *** piuttosto che iter *** *** in grado *** (tutti gli iteratori sono iterabili, ma non viceversa - non tutti gli iterabili sono iteratori). isinstance(x, collections.Iterator)
è il modo perfettamente analogo per verificare specificamente tale condizione.
Un oggetto è iterabile se implementa il protocollo iteratore.
Si potrebbe verificare la presenza di __iter__()
metodo con:
hasattr(object,'__iter__')
in Python 2.x questo approccio non trova oggetti str e altri tipi di sequenze integrate come unicode, xrange, tampone. Funziona in Python 3.
Un altro modo è quello di testare con metodo iter:
try:
iter(object)
except TypeError:
#not iterable
La creazione di iteratore può essere costosa mentre la verifica dell'esistenza degli attributi è sempre * veloce *. –
Per essere un iteratore un oggetto deve superare tre prove:
obj
ha un metodo__iter__
obj
ha un metodonext
(o__next__
in Python 3)obj.__iter__()
rendimentiobj
Quindi, un test roll-your-own sarebbe assomiglia 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
Chiamare 'obj .__ iter __()' rischia di cambiare qualcosa? –
@ BobStein-VisiBone: solo se l'oggetto è bacato. –
- 1. Verificare se è un oggetto
- 2. python 3: come verificare se un oggetto è una funzione?
- 3. Come verificare se un oggetto è definito?
- 4. Come posso verificare se un URL è assoluto usando Python?
- 5. Come verificare se un oggetto è un elenco di stringhe?
- 6. KVO - Come verificare se un oggetto è un osservatore?
- 7. Python: come posso verificare se un oggetto è di tipo datetime.date?
- 8. Come posso verificare se il mio oggetto Python è un numero?
- 9. Come verificare se un oggetto è un Proxy?
- 10. Come posso verificare se un JSON è vuoto in NodeJS?
- 11. Come verificare se un oggetto è iterabile in Ruby?
- 12. Come verificare se un oggetto è uno streaming in NodeJS
- 13. Come posso verificare se un oggetto interfacciato implementa un'altra interfaccia?
- 14. Come posso verificare se un tipo è un sottotipo di un tipo in Python?
- 15. Verifica se un iteratore è valido
- 16. Come verificare se un oggetto è stato modificato
- 17. Come verificare se un oggetto implementa un'interfaccia?
- 18. Come posso verificare se un elenco è ordinato?
- 19. Verificare se esiste un oggetto in VBScript
- 20. Come posso verificare se un valore è un numero?
- 21. Come posso verificare se un filehandle è aperto in Perl?
- 22. Come posso verificare se un IP è attivo in java?
- 23. Come posso verificare se un file è eseguibile in node.js?
- 24. Come verificare se una variabile è un oggetto Moment.js?
- 25. Come verificare se una variabile è un oggetto IEnumerable
- 26. Python: come verificare se un oggetto è un'istanza di un namedtuple?
- 27. Posso verificare se un oggetto è un tipo di classe specifica, in PHP?
- 28. Come verificare se java.lang.reflect.Type è un Enum
- 29. Verificare se un oggetto ha una proprietà
- 30. Come verificare se un modulo python è stato importato?
Le domande chiedono se un oggetto è un iteratore, non se è iterabile. Quindi dovresti usare collections.Iterator invece di collections.Iterable –
@Dave, giusto, fammi modificare per chiarire. –