З документів :
перевернутий ( послідовно )
Повернути реверс iterator
. seq повинен бути об'єктом, який має __reversed__()
метод або підтримує протокол послідовності ( __len__()
метод і __getitem__()
метод з цілими аргументами, починаючи з 0).
dict
Об'єкт не реалізує __reversed__
. Він реалізує обидва останні методи. Однак __getitem__
приймає ключі як аргументи, а не цілі числа (починаючи з 0).
Щодо того, це вже було запропоновано та обговорено тут .
Редагувати:
Ці цитати з списку розсилки Python-Dev (потік "Додати __reversed__ методів для dict", розпочато 25.05.18), я розпочну з "концептуальних" аргументів, спочатку з Антуана Пітру:
Нічого не варто, що OrdersDict вже підтримує reversed (). Аргумент може йти двома способами:
dict схожий на OrdersDict в наші дні, тому він повинен підтримувати і зворотний ();
ви можете використовувати OrdersDict для явного сигналу про те, що ви дбаєте про замовлення; не потрібно нічого додавати, щоб диктувати.
Думаю, що гарантований порядок вставки для звичайних диктів є абсолютно новим, тому пройде певний час, щоб поняття оселилося і стало частиною щоденного роздуму про дикти. Як тільки це станеться, ймовірно, неминуче з'являться випадки використання і в якийсь момент буде додано __reversed__. Реалізація здається простою, і очікувати на те, що кінцева замовлена колекція буде оборотна, не так вже й багато концептуального стрибка.
Після цього відповідь Реймонда Хеттінгера:
Зважаючи на те, що тепер диктовки відстежують порядок вставки, представляється розумним бажати знати найсвіжіші вставки (тобто, перебираючи останні нещодавно додані завдання в диктаті завдань). Інші можливі випадки використання, ймовірно, відповідатимуть тому, як ми використовуємо хвостову команду Unix.
Якщо виникають такі випадки використання, було б добре, щоб __reversed__ вже був підтриманий, щоб люди не спокусилися здійснити некрасиве вирішення за допомогою викликів popitem () з подальшими повторними вставками.
Основне занепокоєння, висловлене в списку розсилки, полягало в тому, що це додасть занадто велику кількість потужностей або знизить ефективність пам’яті (необхідність мати подвійні зв’язані списки замість одноособово пов’язаних) принаймні в деяких реалізаціях, ось цитата Інади Наокі з трекера помилок Python ( випуск 33462 ):
"Мати замовлення" не означає "зворотний". Наприклад, єдиний зв'язаний список упорядкований, але не оборотний.
Хоча реалізація CPython може забезпечити ефективність __reverse__
, додаючи __reverse__
кошти, як очікується, все її реалізація Python забезпечує це. Наприклад, деяка реалізація Python може бути в змозі реалізувати dict за допомогою хешмапу + єдиний пов'язаний список. Якщо __reverse__
додано, це вже неможливо.
Назад до списку розсилки, ось два останні повідомлення (обидва опубліковані 08.06.2018). Спочатку від Михайла Селіка:
Чи правильно я кажу, що консенсус +1 для включення в v3.8?
Останнім пунктом у потоці була INADA Naoki, яка досліджувала різні реалізації та вирішила, що нормально включати цю функцію в 3.8. Наскільки я розумію, Гуїдо погодився з порадою INADA чекати, коли MicroPython реалізує v3.7. Оскільки INADA передумав, я гадаю, це все на користь?
Завершуючи повідомленням Гідо ван Россума:
Це звучить мені правильно. Тоді ми мали б дві версії, де це було так:
3.6, де збереження порядку здійснювалося в CPython, але в мовній специфікації
3.7, де вона також була додана до мовної специфікації
Як зазначається в іншій відповіді та коментарях, reversed()
підтримується як диктовками, так і диктовками з версії 3.8 (14.10.2018).
dict
об’єкт (принаймні не гарантовано з мови), томуreversed
також не було сенсу