Что такое "контейнеры" в python? (И каковы все типы контейнеров python?)
Документация на python часто говорит о "контейнерах". Пример:
Если check_circular - False (по умолчанию: True), то круговой контрольная проверка для типов контейнеров будет пропущена, а круговой ссылка приведет к OverflowError (или, что еще хуже).
Но я не могу найти никакого официального определения контейнеров, ни их списка.
Изменить
Для Python 2.7.3:
Проверенные типы встроенных контейнеров:
(isinstance(object, collections.Container)
возвращает True
)
-
Контейнеры, которые имеют метод __contains__
:
- Все встроенные типы последовательностей: списки, bytearrays, строки, строки Unicode и
кортежи.
- Словари
- Все типы встроенных наборов: наборы и фризонсетты
-
Контейнеры, которые не имеют метода __contains__
:
Проверены встроенные типы, которые не являются контейнерами:
(isinstance(object, collections.Container)
возвращает False
):
- Объекты Int
- Объекты с плавающей точкой
- Длинные объекты
- Булевы объекты
- Объекты модуля
- Файловые объекты
- Буферные объекты
- Объект None
Скажите, какие другие встроенные типы вы проверили для isinstance(object, collections.Container)
, и я добавлю их в список.
Ответы
Ответ 1
Контейнеры - это любой объект, который содержит произвольное количество других объектов. Как правило, контейнеры предоставляют способ доступа к содержащимся объектам и их итерации по ним.
Примеры контейнеров включают tuple
, list
, set
, dict
; это встроенные контейнеры. Дополнительные типы контейнеров доступны в модуле collections
.
Строго говоря, абстрактный базовый класс collections.abc.Container
(collections.Container
в Python2) выполняется для любого типа, поддерживающего оператор in
с помощью магического метода __contains__
; поэтому, если вы можете написать x in y
, тогда y
обычно является контейнером, но не всегда: важной точкой разницы между контейнерами и общими итерами является то, что при повторении контейнеров контейнеры возвращают существующие объекты, на которые они ссылаются, в то время как генераторы и, например, Объекты file
будут создавать новый объект каждый раз. Это имеет значение для сбора мусора и глубокого обхода объекта (например, deepcopy
и сериализации).
В качестве примера iter(lambda: random.choice(range(6)), 0)
поддерживает оператор in
, но это, конечно, не контейнер!
Цель базового класса collections.abc.Container
только с учетом магического метода __contains__
, а не для других способов поддержки оператора in
заключается в том, что истинный контейнер должен иметь возможность проверять сдерживание в течение одной операции и без видимого изменения внутреннего состояния. Поскольку collections.abc.Container
определяет __contains__
как абстрактный метод, вам гарантируется, что если isinstance(x, collections.abc.Container)
, то x
поддерживает оператор in
.
На практике все контейнеры будут иметь магический метод __contains__
. Однако при проверке того, является ли объект контейнером, вы должны использовать isinstance(x, collections.abc.Container)
для ясности и для прямой совместимости, если проверка подкласса Container
будет изменена.
Ответ 2
Согласно http://docs.python.org/dev/library/collections.abc.html#module-collections.abc, наиболее общее определение контейнера - это просто объект, реализующий __contains__
. В общем, концепции Python, такие как "контейнер" или "последовательность", не определяются абстрактно; их поведение "утка". То есть, контейнер - это то, что вы можете использовать для оператора in
.
Типы контейнеров, встроенных в Python, представляют собой кортеж, список, dict, set, frozenset и str и unicode (или байты и str в Python 3), а также пару других конструкций, которые являются технически типами, но обычно не используются за пределами специфические контексты (например, объекты буфера и объекты xrange). Дополнительные типы контейнеров предоставляются в модуле collections
.
Ответ 3
Контейнер - это все объекты python, которые содержат другие объекты, такие как list
или dict
. Тип Container
- это ABC, он ведет себя как интерфейс. Контейнер - это класс, который реализует метод __contains__
.
Вот doc