Dai documenti :
invertito ( seq )
Restituisce un contrario iterator
. seq deve essere un oggetto che ha un __reversed__()
metodo o supporta il protocollo di sequenza (il __len__()
metodo e il __getitem__()
metodo con argomenti interi che iniziano da 0).
Un dict
oggetto non implementa __reversed__
. Implementa entrambi questi ultimi metodi. Tuttavia, __getitem__
accetta le chiavi come argomenti, anziché come numeri interi (a partire da 0).
Quanto al perché, questo è già stato suggerito e discusso qui .
MODIFICARE:
Queste citazioni provengono dalla mailing list di Python-Dev (thread "Aggiungi metodi __reversed__ per dict", iniziato il 25. 05. 18), inizierò con gli argomenti "concettuali", il primo è di Antoine Pitrou:
Non vale nulla che OrderedDict supporta già reversed (). L'argomento potrebbe andare in entrambi i modi:
dict è simile a OrderedDict al giorno d'oggi, quindi dovrebbe supportare anche reverse ();
puoi usare OrderedDict per segnalare esplicitamente che tieni all'ordine; non c'è bisogno di aggiungere nulla a dict.
Il mio pensiero è che l'ordine di inserimento garantito per i dadi regolari sia nuovo di zecca, quindi ci vorrà un po 'di tempo prima che la nozione si stabilizzi e diventi parte del pensiero quotidiano sui dadi. Una volta che ciò accade, è probabilmente inevitabile che emergano casi d'uso e che __reversed__ verrà aggiunto ad un certo punto. L'implementazione sembra semplice e non è un gran salto concettuale aspettarsi che una raccolta ordinata finita sia reversibile.
Seguita dalla risposta di Raymond Hettinger:
Dato che i dicts ora tengono traccia dell'ordine di inserzione, sembra ragionevole voler conoscere gli inserimenti più recenti (ovvero passare in rassegna le attività aggiunte più di recente in un task dict). Altri possibili casi d'uso corrisponderanno probabilmente a come utilizziamo il comando di coda Unix.
Se si presentano questi casi d'uso, sarebbe bello che __reversed__ fosse già supportato in modo che le persone non fossero tentate di implementare una brutta soluzione usando le chiamate popitem () seguite da reinserzioni.
La principale preoccupazione espressa nella mailing list era che ciò avrebbe aggiunto troppa quantità o ridotto l'efficienza della memoria (dovendo avere elenchi doppiamente collegati invece di quelli singolarmente collegati) in almeno alcune implementazioni, ecco la citazione di Inada Naoki dal bug tracker di Python ( numero 33462 ):
"Avere un ordine" non significa "reversibile". Ad esempio, viene ordinato un singolo elenco collegato, ma non reversibile.
Sebbene l'implementazione di CPython sia in grado di fornire in modo efficiente __reverse__
, l'aggiunta __reverse__
implica che tutta l' implementazione di Python dovrebbe fornirla. Ad esempio, alcune implementazioni di Python potrebbero essere in grado di implementare dict con hashmap + singolo elenco collegato. Se __reverse__
viene aggiunto, non è più possibile.
Torna alla mailing list, ecco gli ultimi due messaggi (entrambi pubblicati l'08.06.2018). Il primo è di Michael Selik:
Ho ragione nel dire che il consenso è +1 per l'inclusione nella v3.8?
L'ultimo punto nel thread è stato INADA Naoki che ricerca varie implementazioni e decide che è OK includere questa funzione in 3.8. A quanto ho capito, Guido era d'accordo con il consiglio di INADA di attendere l'implementazione di MicroPython della v3.7. Da quando INADA ha cambiato idea, immagino sia tutto a favore?
Concludendo con il messaggio di Guido van Rossum:
Mi sembra giusto. Avremo quindi avuto due versioni in cui questo era il caso:
Come notato nell'altra risposta e nei commenti, reversed()
è supportato sia per i dicts che per i dictviews dalla versione 3.8 (14.10.2018).
dict
oggetto normale (almeno non garantito dalla lingua), quindireversed
non aveva senso