auf iterierbarkeit prüfen?

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.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

auf iterierbarkeit prüfen?

Beitragvon EnTeQuAk » Samstag 14. Juli 2007, 21:19

Ich habe nur mal eine kleine Frage.

Wie kann ich eine Variable auf iterierbarkeit prüfen?

Übersehe ich eine builtin-function oder geht das nur, indem ich auf vorhandensein der methode __iter__ prüfe?

Danke schonmal im Vorraus!


MfG EnTeQuAk
rafael
User
Beiträge: 189
Registriert: Mittwoch 26. Juli 2006, 16:13

Beitragvon rafael » Samstag 14. Juli 2007, 21:54

EnTeQuAk hat geschrieben:Übersehe ich eine builtin-function

Jap. ;)

Code: Alles auswählen

def is_iterable(arg):
    try:
        iter(arg)
        return True
    except TypeError:
        return False


Cheers,
Rafael
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Sonntag 15. Juli 2007, 09:34

Dann habe ich mich falsch ausgedrückt.

Ich meinte eher, iterierbare Objekte, wie generator-objekte, Listen, und Tupel.

Mit `iter` kann ich auch ein `str` Objekt iterierbar machen.

Das wollte ich nicht prüfen.

Es geht darum, das in einer Variable etweder nur ein einzelner Wert steht oder eine Liste, ein Tupel oder ein generator-objekt.

Ich möchte herausfinden, ob ein einzelner Wert drinne steht oder eben eine Liste, ein Tupel usw.

So weit, wie ich gesehen habe, gibts da halt die Möglichkeit, über __iter__. Das besitzten nur die Objekte, über die ich auch wirklich iterieren möchte. Also Listen, Tupel usw.


Übersehe ich immernoch etwas?

MfG EnTeQuAk
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 15. Juli 2007, 09:44

EnTeQuAk hat geschrieben:Mit `iter` kann ich auch ein `str` Objekt iterierbar machen.

Über ``str``-Objekte kann man auch so schon iterieren, da braucht man kein ``iter()`` dafür.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Sonntag 15. Juli 2007, 09:56

Über ``str``-Objekte kann man auch so schon iterieren, da braucht man kein ``iter()`` dafür.

Was ja auch für Listen, Tupel, und Generator-Objekte zutrifft.

Das ist ja aber nicht das problem, was ich habe ;)
rafael
User
Beiträge: 189
Registriert: Mittwoch 26. Juli 2006, 16:13

Beitragvon rafael » Sonntag 15. Juli 2007, 11:10

Also ein ganzer String über den man normalerweise iterieren kann, soll bei dir auch als einzelner Wert gelten?

Code: Alles auswählen

def is_iterable(arg):
    if type(arg) == str:
        return False
    try:
        iter(arg)
        return True
    except TypeError:
        return False
BlackJack

Beitragvon BlackJack » Sonntag 15. Juli 2007, 11:26

@EnTeQuAk: Ich denke das Hauptproblem ist, dass Du hier gegen die Sprache kämpfst. Letztendlich kann man es nur herausfinden, indem man es tut, und da ist der vorgeschlagene `iter()`-Aufruf eine Methode. Auf `__iter__()` testen reicht nicht, weil auch Objekte, die per Zahlen indexierbar sind, iterierbar sein können, siehe zum Beispiel Zeichenketten.

Was ist denn überhaupt der Anwendungsfall? Auf Zeichenketten als Ausnahme würde ich mit `isinstance()` und `basestring` testen.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Sonntag 15. Juli 2007, 11:44

Was ist denn überhaupt der Anwendungsfall?


Eine art URL-System, für nen Blog-System.

Es geht darum, das es verschiedene Views gibt. Eine View ist sozusagen der handler eines requests und gibt die Ausgaben an den Clienten zurück.

Nun soll eine View aber unter mehreren URLs aufgerufen werden können.

Dazu gibt es das Attribut `rules`. Entweder Es gibt nur eine `URLRule` oder eine Liste, ein Tupel von `URLRule`s.

Das würde ich gerne teste, ob es eine oder mehrere sind.

MfG EnTeQuAk
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Sonntag 15. Juli 2007, 11:53

Warum nimmst du nicht grundsätzlich eine Liste an? Wenn du nur einen Eintrag "foo" hast, brauchst du nur ["foo"] oder ("foo",) zu schreiben...
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Sonntag 15. Juli 2007, 12:48

Warum nimmst du nicht grundsätzlich eine Liste an? Wenn du nur einen Eintrag "foo" hast, brauchst du nur ["foo"] oder ("foo",) zu schreiben...


Währe die letzte Möglichkeit, die ich eingeschlagen hätte. Aber vermutlich wirds so wohl am besten/einfachsten sein.


Danke nochmal!


MfG EnTeQuAk
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Beitragvon nkoehring » Sonntag 15. Juli 2007, 12:55

...und wenn du sicher sein kannst, dass es entweder ein einzelnes Objekt oder eine Liste bzw ein Tuple ist, dann kannst du auch einfach auf eben die beiden letzteren testen:

Code: Alles auswählen

def is_multiple(obj):
    return type(obj)!=list and type(obj)!=tuple
Also das ist jetzt nur schnell zusammengehackt, sollte aber eigentlich funktionieren.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Beitragvon veers » Sonntag 15. Juli 2007, 14:00

Hm, wie wäre es wenn du Strings Extra behandelst und nicht iterables. Irgend wie so:

Code: Alles auswählen

if is_iterable(x) and type(x) is not str:
    return x
return (x, )
BlackJack

Beitragvon BlackJack » Sonntag 15. Juli 2007, 14:28

Nochmal: auf Zeichenketten bitte mit ``isinstance(obj, basestring)`` testen. So erwischt man auch Unicode-Zeichenketten und alles was von `str` und `unicode` abgeleitet ist.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Beitragvon veers » Sonntag 15. Juli 2007, 15:23

BlackJack hat geschrieben:Nochmal: auf Zeichenketten bitte mit ``isinstance(obj, basestring)`` testen. So erwischt man auch Unicode-Zeichenketten und alles was von `str` und `unicode` abgeleitet ist.
Wieder etwas gelernt :)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Sonntag 15. Juli 2007, 17:36

EnTeQuAk: Routes kommt für dich nicht in Frage?

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder