2015-03-03 1 views
43

Я продолжаю видеть функции и документацию, как this и this(назвать несколько) которые работают или обратитесь к список подобных объектов.Есть ли официальный или общеизвестный стандарт минимального интерфейса для объекта «списка»?

Я вполне осознает, что именно фактический список (dir(list)), и может вывести, что (часто варьируя) методы из списка необходимы в большинстве ссылок на «список подобных объектов», однако сколько раз я вижу ссылку на нее, оставил мне следующий вопрос:

Есть ли стандартный или минимальный интерфейс для стандартного минимального интерфейса для «списка»? Проще как актуализировать __getitem__, или согласен, что необходимы дополнительные вещи, такие как __len__ и __setitem__?

Это может показаться семантикой, но я не могу не подумать, что если не существует стандартного минимального требования к интерфейсу, различные идеи "list-likeness" могут вызвать некоторые проблемы/неправильную обработку. Может быть, это всего лишь небольшая минута для печатания утиных питов?

+0

Возможный дубликат [Полный список протоколов/интерфейсов Python] (http://stackoverflow.com/questions/6087731/comprehensive-list-of-python-protocols-interfaces) – aruisdante

+0

Да, это так, если вы нажмете ссылки на [модель данных python] (https://docs.python.org/2/reference/datamodel.html). «Список» представляет собой реализацию * изменяемой последовательности *. Модель данных описывает, что это влечет за собой. Большая документация просто называет это «списком», потому что список - это, по сути, каноническая реализация * изменяемой последовательности *, но она ни в коем случае не единственная. – aruisdante

+14

Добро пожаловать в чудесный мир утки. – rightfold

ответ

41

См. Модуль collections.abc. Из приведенных там абстрактных базовых классов list в Python реализует Iterable, Container, Sized, Sequence и MutableSequence. Теперь из них Iterable, Sequence и MutableSequence можно было случайно назвать list-like.

Однако, я понимаю этот термин список подобных означает, что это MutableSequence - имеет, по крайней мере, методы __getitem__, __setitem__, __delitem__ и __len__, ожидающие также его иметь методы подмешать, указанные в документации, таких как append.

Если нет необходимости в __setitem__ и __delitem__ следует назвать последовательность вместо этого - предположение, что если что-то принимает последовательность, он не должен быть изменяемым, таким образом str, bytes, tuple и т.д. также работать там.


Ваши две ссылки подчеркивают расплывчатость термина:

plotly API требует, чтобы list-like объекты будут упорядочены в массив JSON внутренним PlotlyJSONEncoder, что делегаты большинства из кодировки на Python JSONEncoder , Однако последний кодирует только tuple и list (и подклассы) в массив JSON; таким образом, список здесь означает list, tuple или их подклассы. Пользовательский объект последовательности, который не является подклассом, приведет к TypeError: [...] is not JSON serializable.

unzip recipe вы связаны требует объект, который ведет себя как Sequence (Изменчивость не требуется), таким образом, tuplestr или, или любой пользовательский объект, реализующий Sequence там будут делать.


TL; DR список подобных является расплывчатым термином. Предпочтительно использовать термины итеративная, последовательность и изменяемая последовательность, теперь, когда они определены в collections.abc.

+0

многое проясняет. Поэтому, хотя нет «стандартного» минимального определения (отвечает на мой главный вопрос), вы говорите, что он, вероятно, должен * (или, возможно, общепринятый) ссылаться на «MutableSequence»? – HavelTheGreat

+2

Или даже лучше, что называть вещи Iterable, Sequence, MutableSequence или список вместо чего-то неопределенного типа * list-like * –

+1

Cheers. Полагаю, плохая терминология в целом. Благодаря! – HavelTheGreat

10

Технический термин для «списка объектов» - . Последовательность. По крайней мере, он поддерживает упорядочение (т. Е. Два объекта с одинаковыми элементами, но разные порядки не равны), индексирование (foo[bar] такое, что bar является целым числом, меньшим длины последовательности) и проверок локализации (in), и имеет заданной длины. Это должно поддержка итерации, но если нет, то Python будет имитировать ее с помощью индексации.

+5

Я думаю, что «изменчивая последовательность» будет более точной. Кортеж, например, представляет собой последовательность, но не поддерживает назначение элемента ('__setitem__'), как это делает список. Если функция документирована, чтобы взять объект, подобный списку, он вполне может намереваться мутировать этот объект. – iCodez

+2

@iCodez: Мы согласны не согласиться. Я лично считаю, что изменение изменчивых аргументов является патологическим поведением, поскольку нет никакой гарантии (помимо документации, конечно), что аргумент будет изменяться в первую очередь. –

+4

Модель данных python довольно конкретно указывает, что список является изменяемой последовательностью. Любой API, определяющий список, почти наверняка будет ожидать mutablilty, иначе он (или, по крайней мере, должен) использовать другой термин.Хорошие/плохой параметр, который используется как вход и выход, на самом деле не является частью области модели данных python. Кроме того, API может указывать, что он возвращает * list-like, и в этом случае вопрос об изменении входов является спорным. – aruisdante

8

Практически каждый раз, когда вы видите «-подобный объект» в документации на Python, автор сознательно расплывчато. Автор решил, что перечисление всех необходимых интерфейсов будет слишком сложным, и говорит только о том, что некоторые из его интерфейсов требуются. Объект, который реализовал все интерфейсы, гарантированно работает, но в большинстве случаев он будет работать с объектом, который реализует гораздо меньше.

С помощью «списка, подобного объекту», возможно, лучшее, что вы можете сделать, помимо проверки исходного кода, заключается в том, чтобы определить, нужен ли ему какой-либо из изменяемых интерфейсов. Если ему нужен только доступ только для чтения к списку, вы можете быть уверены, что вам не нужно выполнять какие-либо операции с изменяемой последовательностью.

Если он говорит «объект, похожий на список или итератор», вы можете предоставить что-то, что реализует гораздо более простой интерфейс итератора.