Ich versuche eine Funktion zu erstellen, die ein Iterable akzeptiert und ein Tupel zurückgibt, vorausgesetzt, dass das Iterable immer in einer kanonischen Weise iteriert wird. Zum Beispiel, wenn die Eingabe iterable list
oder tuple
-Like ist, möchte ich die Eingabe akzeptieren, aber nicht, wenn es dict
-Like (wo gibt es keine Garantie für die Reihenfolge der Schlüssel). Gibt es irgendeine Python-Funktion, um die Unterschiede zwischen Objekten zu erkennen, die immer in der gleichen Reihenfolge iteriert werden, im Vergleich zu denen, bei denen die Reihenfolge von Version zu Version geändert werden kann oder von PYTHONHASHSEED
abhängt?Geordnete Iterables (Sequenzen) in Python erkennen
isinstance(x, collections.Sequence)
macht das meiste von dem, was ich will, aber Generatoren sind keine Sequenzen. Der folgende Code scheint zu tun, was ich will, aber ich bin mir nicht sicher, ob ich etwas auslasse oder ob es einen allgemeineren Weg gibt, die Idee einer geordneten, aber nicht unbedingt indexierbaren, iterierbaren Idee einzufangen.
import collections, types
def to_tuple(x):
if isinstance(x, collections.Sequence) or isinstance(x, types.GeneratorType):
return tuple(x)
raise Exception("Cannot be iterated canonically")
In Bezug auf Generatoren - Sie können nicht gehen über den gleichen Generator zum zweiten Mal in der gleichen Weise - also warum sollten Sie es aufnehmen wollen? –
@AdamSosnowski Wenn das ein Problem ist, könnte ich 'itiltools.tee()' verwenden, um den Generator zuerst zu klonen, aber für meine Zwecke ist es egal, ob ich die ursprüngliche Eingabe verarbeite. –