Обращение к элементу объекта 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 можно создавать веб-скраперы для извлечения данных из веб-сайтов.
«Упорядоченный» не означает «эффективно индексируемый». Нет более эффективного способа получить N-й элемент представления dict, чем выполнить итерацию N шагов.
Разрешение индексации создаст впечатление, что представления могут эффективно поддерживать эту операцию, что, в свою очередь, приведет к крайне неэффективному кодированию. Попытка изменить реализацию так, чтобы индексирование было эффективным, сделает другие операции с диктовками намного менее эффективными, что нецелесообразно для случаев использования, для которых на самом деле предназначены дикты.