Почему dict_keys, dict_values ​​и dict_items не подлежат подписке?

Обращение к элементу объекта dict_keys, dict_values или dict_items по индексу вызывает ошибку типа. Например:

> my_dict = {"foo": 0, "bar": 1, "baz": 2}
> my_dict.items()[0]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
----> 1 my_dict.items()[0]

TypeError: 'dict_items' object is not subscriptable

Мой вопрос не в том, как с этим справиться. Я знаю, что можно просто вызвать list() или tuple() для объекта dict_keys, dict_values или dict_items, а затем подписать его.

Мой вопрос: почему такое поведение все еще сохраняется в Python, учитывая, что порядок элементов в словаре гарантирован начиная с Python 3.7.0. Почему невозможно (или нежелательно) провести рефакторинг типов dict_keys, dict_values и dict_items, чтобы они могли подписываться?

В документации к stdlib эти типы описаны как «объекты просмотра». Я полагаю, что именно здесь находится ответ на мой вопрос, но я не могу найти более подробное описание того, что на самом деле представляет собой «объект представления». Может ли кто-нибудь просветить меня по этому вопросу?

🤔 А знаете ли вы, что...
С Python можно создавать веб-скраперы для извлечения данных из веб-сайтов.


5
135
1

Ответ:

Решено

«Упорядоченный» не означает «эффективно индексируемый». Нет более эффективного способа получить N-й элемент представления dict, чем выполнить итерацию N шагов.

Разрешение индексации создаст впечатление, что представления могут эффективно поддерживать эту операцию, что, в свою очередь, приведет к крайне неэффективному кодированию. Попытка изменить реализацию так, чтобы индексирование было эффективным, сделает другие операции с диктовками намного менее эффективными, что нецелесообразно для случаев использования, для которых на самом деле предназначены дикты.