Was genau bedeutet "durchsuchbar" bedeutet in Python?

Zuerst möchte ich klarstellen, ich bin NICHT zu Fragen, was ist "iterator".

Dies ist, wie der Begriff "durchsuchbar" ist in Python definiert ist doc:

iterierbar
Ein Objekt in der Lage die Rückkehr seiner Mitglieder ein zu einer Zeit.
Beispiele von iterables gehören alle Sequenz-Typen (wie list, str,
und Tupel) und einige nicht-Sequenz-Typen wie dict, file-Objekten, und
Objekte von Klassen, die Sie definieren, mit einem __iter__ (), __getitem__()
Methode. Iterables können verwendet werden in einer for-Schleife und in vielen anderen Orten
wo eine Sequenz benötigt wird (zip(), map(), ...). Wenn ein durchsuchbar
Objekt als argument übergeben, um die eingebaute Funktion iter(),
gibt einen iterator für das Objekt. Dieser iterator ist gut für einen Durchgang
über der Menge der Werte. Bei der Verwendung von iterables, es ist in der Regel nicht
notwendig zum Aufruf von iter() oder befassen sich mit iterator-Objekte zu erstellen. Die
for-Anweisung macht das automatisch für Sie, Sie erstellen eine temporäre
Unbenannte variable, um den iterator für die Dauer der Schleife.
Siehe auch iterator, sequence und einem generator.

Als andere Personen vorgeschlagen, mit isinstance(e, collections.Iterable) ist die pythonic Weg, um zu überprüfen, ob ein Objekt ist iterierbar.
So habe ich einige test mit Python 3.4.3:

from collections.abc import Iterable

class MyTrain:
    def __getitem__(self, index):
        if index > 3:
            raise IndexError("that's enough!")

        return index

for name in MyTrain():
    print(name)  # 0, 1, 2, 3

print(isinstance(MyTrain(), Iterable))  # False

Das Ergebnis ist schon Recht seltsam: MyTrain definiert hat __getitem__ Methode, aber es ist als nicht wiederholenden Objekt, nicht zu erwähnen, es ist in der Lage, die Rückkehr einer Zahl zu einem Zeitpunkt.

Dann entfernte ich __getitem__ und fügte hinzu, die __iter__ Methode:

from collections.abc import Iterable

class MyTrain:    
    def __iter__(self):
        print("__iter__ called")
        pass

print(isinstance(MyTrain(), Iterable))  # True

for name in MyTrain():
    print(name)  # TypeError: iter() returned non-iterator of type 'NoneType'

Es ist jetzt als eine "wahre" wiederholenden Objekt, obwohl es nicht etwas zu produzieren, während der Iteration.

Also habe ich etwas missverstehen oder ist die Doku falsch?

isinstance nicht überprüfen, dass die Schnittstelle ordnungsgemäß umgesetzt werden, dass nicht zu bekommen, fand heraus, bis Sie tatsächlich versuchen, zu Durchlaufen, nur, dass die entsprechende Methode(N) (in diesem Fall nur __iter__) verfügbar sind.
docs.python.org/3/library/...
"mit isinstance(e, collections.Iterable) ist die pythonic Weg, um zu überprüfen, ob ein Objekt ist iterierbar" - Nein, ich würde sagen, dass Sie versuchen zu Durchlaufen, es ist die Pythonic way!
um zu testen, ob etwas ist ein iterierbar, ich mache ein try / außer block in dem ich versuche var = iter(var), wenn er wirft, und der Ausnahme -, dann ist es nicht iterierbar
Aber das wäre kontraproduktiv, denn es könnte zu verbrauchen, das iterierbar ist. Vielleicht ist ein besserer check wäre, zu versuchen iter(x) und sehen, ob es wirft ein TypeError.

InformationsquelleAutor laike9m | 2015-09-26

Schreibe einen Kommentar