Aus den Dokumenten :
umgekehrt ( seq )
Rückgabe rückgängig machen iterator
. seq muss ein Objekt sein, das eine __reversed__()
Methode hat oder das Sequenzprotokoll unterstützt (die __len__()
Methode und die __getitem__()
Methode mit ganzzahligen Argumenten ab 0).
Ein dict
Objekt wird nicht implementiert __reversed__
. Beide letzteren Methoden werden implementiert. Allerdings __getitem__
nimmt Schlüssel als Argumente, anstatt ganze Zahlen (ab 0) gewonnen .
Wie, warum ist dies bereits vorgeschlagen und diskutiert hier .
BEARBEITEN:
Diese Zitate stammen aus der Python-Dev-Mailingliste (Thread "Add __reversed__ Methods for dict", gestartet am 25. 05. 18). Ich beginne mit den "konzeptuellen" Argumenten, das erste stammt von Antoine Pitrou:
Es ist nichts wert, dass OrderedDict bereits reverse () unterstützt. Das Argument könnte in beide Richtungen gehen:
dict ähnelt heutzutage OrderedDict, daher sollte es auch reverse () unterstützen.
Sie können OrderedDict verwenden, um explizit zu signalisieren, dass Ihnen die Bestellung wichtig ist. Sie müssen nichts hinzufügen, um zu diktieren.
Mein Gedanke ist, dass die garantierte Einfügereihenfolge für reguläre Diktate brandneu ist, daher wird es eine Weile dauern, bis sich der Begriff festgesetzt hat und Teil des täglichen Denkens über Diktate wird. Sobald dies geschieht, ist es wahrscheinlich unvermeidlich, dass Anwendungsfälle auftreten und __reversed__ irgendwann hinzugefügt wird. Die Implementierung scheint unkompliziert zu sein und es ist kein großer konzeptioneller Sprung zu erwarten, dass eine endlich geordnete Sammlung reversibel ist.
Gefolgt von Raymond Hettingers Antwort:
Angesichts der Tatsache, dass Diktate jetzt die Einfügereihenfolge verfolgen, erscheint es vernünftig, die neuesten Einfügungen kennen zu wollen (dh die zuletzt hinzugefügten Aufgaben in einem Aufgabendiktat zu durchlaufen). Andere mögliche Anwendungsfälle entsprechen wahrscheinlich der Verwendung des Unix-Befehls tail.
Wenn diese Anwendungsfälle auftreten, wäre es schön, wenn __reversed__ bereits unterstützt würde, damit die Benutzer nicht versucht sind, eine hässliche Problemumgehung mithilfe von popitem () -Aufrufen und anschließendem Einfügen zu implementieren.
Das Hauptanliegen in der Mailingliste war, dass dies in zumindest einigen Implementierungen zu viel Aufblähen oder zu einer Verringerung der Speichereffizienz führen würde (doppelt verknüpfte Listen anstelle einfach verknüpfter Listen). Hier ist Inada Naokis Zitat aus Python Bug Tracker ( Ausgabe 33462) ):
"Bestellung haben" bedeutet nicht "umkehrbar". Beispielsweise wird eine einzelne verknüpfte Liste sortiert, aber nicht umkehrbar.
Während die CPython-Implementierung effizient sein kann __reverse__
, __reverse__
bedeutet das Hinzufügen, dass alle Python-Implementierungen dies bereitstellen. Beispielsweise kann eine Python-Implementierung möglicherweise Diktat mit Hashmap + einzelner verknüpfter Liste implementieren. Wenn __reverse__
hinzugefügt wird, ist es nicht mehr möglich.
Zurück zur Mailingliste, hier sind die beiden letzten Nachrichten (beide veröffentlicht am 08.06.2018). Erstens von Michael Selik:
Habe ich Recht, wenn ich sage, dass der Konsens für die Aufnahme in Version 3.8 +1 ist?
Der letzte Punkt im Thread war, dass INADA Naoki verschiedene Implementierungen untersuchte und entschied, dass es in Ordnung ist, diese Funktion in 3.8 aufzunehmen. Soweit ich weiß, stimmte Guido dem Rat von INADA zu, auf die Implementierung von v3.7 durch MicroPython zu warten. Da INADA seine Meinung geändert hat, schätze ich, dass alles dafür ist?
Abschließend die Botschaft von Guido van Rossum:
Das klingt für mich richtig. Wir werden dann zwei Versionen gehabt haben, in denen dies der Fall war:
3.6 wo die Auftragserhaltung in CPython implementiert wurde, jedoch in der Sprachspezifikation
3.7 wo es auch zur Sprachspezifikation hinzugefügt wurde
Wie in den anderen Antworten und Kommentaren erwähnt, reversed()
wird es seit Version 3.8 (14.10.2018) sowohl für Diktate als auch für Diktatansichten unterstützt.
dict
Objekt (zumindest nicht aus der Sprache garantiert), alsoreversed
machte es auch keinen Sinn__reversed__
?" Der Python-Dev-Link hat nützlichen Inhalt, aber die relevanten Teile sollten direkt in der Antwort wiedergegeben werden (da solche externen Links dazu neigen, zu verrotten).Da Python 3.8 reverse () für Diktate verwendbar ist
quelle
Update für Python 3.8
Dict und Dictviews können jetzt in umgekehrter Einfügereihenfolge mit reverse () iteriert werden.
quelle