Dos documentos :
invertido ( seq )
Retorne um reverso iterator
. seq deve ser um objeto que possui um __reversed__()
método ou suporta o protocolo de sequência (o __len__()
método e o __getitem__()
método com argumentos inteiros iniciando em 0).
Um dict
objeto não implementa __reversed__
. Ele implementa os dois últimos métodos. Contudo,__getitem__
aceita chaves como argumentos, em vez de números inteiros (começando em 0).
Quanto ao motivo, isso já foi sugerido e discutido aqui .
EDITAR:
Essas citações são da lista de discussão Python-Dev (segmento "Adicionar métodos __reversed__ para dict", iniciado em 25. 05. 18), começarei com os argumentos "conceituais", o primeiro é de Antoine Pitrou:
Não vale nada que OrderedDict já suporte reversed (). O argumento poderia ser de duas maneiras:
O dict é semelhante ao OrderedDict hoje em dia, portanto, ele também deve suportar reversed ();
você pode usar o OrderedDict para sinalizar explicitamente que se importa com o pedido; não há necessidade de adicionar nada para ditar.
Meu pensamento é que a ordem de inserção garantida para ditados regulares é nova em folha, por isso levará um tempo para que a noção se estabeleça e se torne parte do pensamento diário sobre ditados. Quando isso acontece, é provavelmente inevitável que casos de uso surjam e que __reversed__ sejam adicionados em algum momento. A implementação parece direta e não é um salto conceitual esperar que uma coleção ordenada finita seja reversível.
Seguido pela resposta de Raymond Hettinger:
Dado que os ditados agora controlam a ordem de inserção, parece razoável querer saber as inserções mais recentes (ou seja, repetir as tarefas adicionadas mais recentemente em um ditado de tarefa). Outros possíveis casos de uso provavelmente corresponderão à forma como usamos o comando tail do Unix.
Se esses casos de uso surgirem, seria bom que __reversed__ já fosse suportado, para que as pessoas não fiquem tentadas a implementar uma solução alternativa feia usando chamadas popitem () seguidas de reinserções.
A principal preocupação expressa na lista de discussão é que isso adicionaria muito inchaço ou reduziria a eficiência da memória (tendo que ter listas duplamente vinculadas em vez de únicas) em pelo menos algumas implementações. Aqui está a citação de Inada Naoki do rastreador de erros do Python ( edição 33462 ):
"Ter um pedido" não significa "reversível". Por exemplo, uma lista vinculada única é ordenada, mas não reversível.
Embora a implementação do CPython possa oferecer eficiência __reverse__
, adicionar __reverse__
significa que toda a implementação do Python deve fornecê-la. Por exemplo, algumas implementações do Python podem ser capazes de implementar o dict com hashmap + lista vinculada única. Se __reverse__
for adicionado, não será mais possível.
De volta à lista de discussão, aqui estão as duas últimas mensagens (ambas postadas em 06.08.2018). Primeiro é de Michael Selik:
Estou correto ao dizer que o consenso é +1 para inclusão na v3.8?
O último ponto do tópico foi o INADA Naoki pesquisando várias implementações e decidindo que não há problema em incluir esse recurso no 3.8. Pelo que entendi, Guido estava de acordo com os conselhos do INADA em aguardar a implementação da versão 3.7 da MicroPython. Desde que o INADA mudou de idéia, acho que é tudo a favor?
Concluindo com a mensagem de Guido van Rossum:
Isso parece certo para mim. Teremos então duas versões em que este foi o caso:
3.6 onde a preservação da ordem foi implementada no CPython, mas na especificação da linguagem
3.7, onde também foi adicionado à especificação do idioma
Conforme observado nas outras respostas e comentários, reversed()
é suportado para dictviews e dictviews desde a versão 3.8 (14.10.2018).
dict
objeto (pelo menos não garantida da língua) para quereversed
também não fazia sentido