De los documentos :
invertido ( seq )
Devuelve un reverso iterator
. seq debe ser un objeto que tenga un __reversed__()
método o admita el protocolo de secuencia (el __len__()
método y el __getitem__()
método con argumentos enteros que comienzan en 0).
Un dict
objeto no se implementa __reversed__
. Implementa ambos métodos. Sin embargo, __getitem__
toma las claves como argumentos, en lugar de enteros (comenzando en 0).
En cuanto a por qué, esto ya ha sido sugerido y discutido aquí .
EDITAR:
Estas citas son de la lista de correo Python-Dev (hilo "Agregar métodos __reversed__ para dict", comenzó el 25. 05. 18), comenzaré con los argumentos "conceptuales", el primero es de Antoine Pitrou:
No vale nada que OrderedDict ya sea compatible con reverse (). El argumento podría ir en ambos sentidos:
dict es similar a OrderedDict hoy en día, por lo que también debería ser compatible con reverse ();
puedes usar OrderedDict para indicar explícitamente que te importa hacer un pedido; No es necesario agregar nada para dictar.
Creo que el orden de inserción garantizado para los dictos regulares es completamente nuevo, por lo que tomará un tiempo para que la noción se asiente y se convierta en parte del pensamiento cotidiano sobre los dictados. Una vez que eso suceda, es probable que surjan casos de uso y que se agregue __reversión__ en algún momento. La implementación parece sencilla y no es un gran salto conceptual esperar que una colección ordenada finita sea reversible.
Seguido por la respuesta de Raymond Hettinger:
Dado que los dictados ahora rastrean el orden de inserción, parece razonable querer conocer las inserciones más recientes (es decir, recorrer las tareas agregadas más recientemente en un dict de tarea). Otros posibles casos de uso probablemente corresponderán a cómo usamos el comando de cola de Unix.
Si surgen esos casos de uso, sería bueno que __reversed__ ya sea compatible para que las personas no se vean tentadas a implementar una solución fea usando llamadas popitem () seguidas de reinserciones.
La principal preocupación expresada en la lista de correo era que esto agregaría demasiada hinchazón o reduciría la eficiencia de la memoria (tener que tener listas doblemente vinculadas en lugar de solo vinculadas) en al menos algunas implementaciones, aquí está la cita de Inada Naoki del rastreador de errores de Python ( problema 33462 ):
"Tener un pedido" no significa "reversible". Por ejemplo, una sola lista vinculada está ordenada, pero no es reversible.
Si bien la implementación de CPython puede proporcionar eficiencia __reverse__
, agregar __reverse__
significa que se espera que toda la implementación de Python lo proporcione. Por ejemplo, algunas implementaciones de Python pueden implementar dict con hashmap + lista enlazada individual. Si __reverse__
se agrega, ya no es posible.
De vuelta a la lista de correo, aquí están los dos últimos mensajes (ambos publicados el 06.06.2018). Primero es de Michael Selik:
¿Estoy en lo cierto al decir que el consenso es +1 para su inclusión en v3.8?
El último punto en el hilo fue INADA Naoki investigando varias implementaciones y decidiendo que está bien incluir esta característica en 3.8. Según tengo entendido, Guido estuvo de acuerdo con el consejo de INADA de esperar la implementación de v3.7 de MicroPython. Dado que INADA ha cambiado de opinión, ¿supongo que todo está a favor?
Concluyendo con el mensaje de Guido van Rossum:
Suena bien para mi. Entonces habremos tenido dos versiones donde este fue el caso:
Como se señaló en la otra respuesta y comentarios, reversed()
es compatible tanto con los dictados como con las vistas desde la versión 3.8 (14.10.2018).
dict
objeto normal (al menos no garantizado por el lenguaje), por lo quereversed
tampoco tenía sentido__reversed__
"? El enlace python-dev tiene contenido útil, pero las partes relevantes deben reproducirse directamente en la respuesta (dado que dichos enlaces externos tienden a pudrirse).Desde python 3.8 reverse () se puede usar en dicts
fuente
Actualización para python 3.8
Dict y dictviews ahora son iterables en orden de inserción invertido usando reverseed ()
fuente