Что означает "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
, отсутствуют, вы все равно можете говорить о диктоподобном объекте. Сравните файловые объекты.