Abfrage ob ein Objekt iterierbar ist

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
usepolt
User
Beiträge: 9
Registriert: Dienstag 20. April 2010, 10:29

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
lunar

Das funktioniert schon, aber wozu sollte man das benötigten?
usepolt
User
Beiträge: 9
Registriert: Dienstag 20. April 2010, 10:29

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
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
usepolt
User
Beiträge: 9
Registriert: Dienstag 20. April 2010, 10:29

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!
lunar

Man sollte eine solche Überprüfung aber nicht verwenden, um den ValueError zu vermeiden.
usepolt
User
Beiträge: 9
Registriert: Dienstag 20. April 2010, 10:29

@lunar: Kannst du das etwas mehr ausführen? Oder mit anderen Worten: Wofür denn sonst? :lol:
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".
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.
Antworten