Seite 1 von 1
Abfrage ob ein Objekt iterierbar ist
Verfasst: Freitag 23. April 2010, 15:13
von usepolt
Moin!
Was ist eurer Meinung nach die beste Art abzufragen ob ein Objekt iterierbar ist? Ich dachte da an
try except:
Code: Alles auswählen
>>> def is_iterable(iterable) :
... try :
... iter(iterable)
... return True
... except TypeError :
... return False
...
>>> is_iterable(2)
False
>>> is_iterable("sdasdas")
True
>>> is_iterable((1,0))
True
>>>
Grüße
Verfasst: Freitag 23. April 2010, 15:17
von lunar
Das funktioniert schon, aber wozu sollte man das benötigten?
Verfasst: Freitag 23. April 2010, 15:21
von usepolt
Hallo lunar!
Es geht in diesem Fall um einen Wiki-Artikel über sequence unpacking für Anfänger, ich würde gern diese Abfrage als Info mit einbauen.
Wiki-Artikel:
http://wiki.python-forum.de/usepolt/seq ... 0unpacking
Diskussion zum Artikel:
http://www.python-forum.de/topic-22703.html
Verfasst: Freitag 23. April 2010, 15:25
von Darii
Dann nimm was ich dir geschrieben hatte. Ist am kürzesten und sofern die abc nicht kaputt sind(was mich allerdings leider nicht wundern würde, numbers.Number ist jedenfalls schonmal kaputt), sollte es zuverlässig sein.
Verfasst: Freitag 23. April 2010, 15:31
von usepolt
Code: Alles auswählen
>>> import collections
>>> isinstance(2, collections.Iterable)
False
>>> isinstance("string", collections.Iterable)
True
>>> isinstance(("we",2), collections.Iterable)
True
>>>
Ich halte beide Varianten für Sinnvoll und praktikabel, werde wohl beide einbauen.
Dank euch!
Verfasst: Freitag 23. April 2010, 16:17
von lunar
Man sollte eine solche Überprüfung aber nicht verwenden, um den ValueError zu vermeiden.
Verfasst: Freitag 23. April 2010, 16:21
von usepolt
@lunar: Kannst du das etwas mehr ausführen? Oder mit anderen Worten: Wofür denn sonst?

Verfasst: Freitag 23. April 2010, 16:47
von lunar
Es gibt Gründe, eine solche Prüfung zu nutzen, wenn man beispielsweise bei einem Parameter unterscheiden möchte, ob er iterierbar ist oder nicht, um die Funktion dementsprechend anzupassen.
Allerdings nutzt man sie nicht, um eine Ausnahme zu vermeiden. Stattdessen versucht man es einfach, und behandelt wenn nötig die Ausnahme. Dahinter steht das Paradigma "it's easier to ask for forgiveness than it is to get permission".
Verfasst: Freitag 23. April 2010, 18:00
von BlackJack
Und nochmal auch an dieser Stelle: Man kann nicht zuverlässig prüfen ob ein Objekt "iterable" ist ohne tatsächlich den Versuch zu unternehmen. Man kann ein "iterable" schreiben, das von aussen nicht als solches sicher identifiziert werden kann bevor nicht das erste Element angefordert wurde. Damit würde eine Prüfmethode potentielle "iterables" fälschlicherweise zurückweisen.