Что означает "dict-like" в Python?

Иногда люди ссылаются на объекты X-like в Python. Пример:

data_iter_maker - дескриптор с нулевым аргументом, который возвращает итератор над объектами данных типа dict.

Есть ли у "dict-like" точное определение, и если да, то что это? Будет ли это объект x, который может быть проиндексирован как словарь, может: x[a], где a является хешируемой? В этом случае именованный элемент может не считаться dict-like, поскольку вы не можете индексировать, используя выражение типа x['a'] (последнее, что я проверил, вам нужно написать x.a). Но, с другой стороны, namedtuples функционально настолько похожи на dicts, что я не уверен, что думать.

Цинично, я испытываю соблазн предположить, что "dict-like" означает "объект, достаточно похожий на то, чтобы указать, что мой код будет давать тот же ответ, как если бы вы представили семантически эквивалентный объект dict". Другими словами, "запустите функцию и узнайте сами, если ваш аргумент диктофон!"

В более общем смысле, это X-подобный объект, который реализует тот же интерфейс, что и X?

Ответ 1

Python использует duck-typing ':

"Если это выглядит как утка и шарлатанцы, как утка, это, должно быть, утка".

Или, может быть, "Если это выглядит как утка и шарлатан, как утка, это достаточно близко к утке, чтобы относиться к ней как к одному". Очевидно, первое звучит лучше. Это тесно связано с доктриной python "Легче просить прощения, чем просить разрешения" .

Объект dict-like который реализует (или эмулирует) интерфейс словаря. такая же концепция часто возникает для итераций и часто в numpy для объектов с массивом (или типа array_like).

Ответ 2

Практическая утиная печать:

dict_meths = set(dir({}))

# Python3
class A:
    pass

default_meths = set(dir(A()))

diff = dict_meths - default_meths

Теперь diff:

{'__contains__',
 '__delitem__',
 '__getitem__',
 '__iter__',
 '__len__',
 '__setitem__',
 'clear',
 'copy',
 'fromkeys',
 'get',
 'items',
 'keys',
 'pop',
 'popitem',
 'setdefault',
 'update',
 'values'}

Когда вы реализуете все эти методы в своем классе, у вас, безусловно, есть объект типа dict. Если некоторые из менее распространенных, например update, отсутствуют, вы все равно можете говорить о диктоподобном объекте. Сравните файловые объекты.