Подтвердить что ты не робот

Что такое "контейнеры" в python? (И каковы все типы контейнеров python?)

Документация на python часто говорит о "контейнерах". Пример:

Если check_circular - False (по умолчанию: True), то круговой контрольная проверка для типов контейнеров будет пропущена, а круговой ссылка приведет к OverflowError (или, что еще хуже).

Но я не могу найти никакого официального определения контейнеров, ни их списка.

Изменить

Для Python 2.7.3:

Проверенные типы встроенных контейнеров:

(isinstance(object, collections.Container) возвращает True)

  • Контейнеры, которые имеют метод __contains__:

    • Все встроенные типы последовательностей: списки, bytearrays, строки, строки Unicode и кортежи.
    • Словари
    • Все типы встроенных наборов: наборы и фризонсетты
  • Контейнеры, которые не имеют метода __contains__:

    • объекты xrange

Проверены встроенные типы, которые не являются контейнерами:

(isinstance(object, collections.Container) возвращает False):

  • Объекты Int
  • Объекты с плавающей точкой
  • Длинные объекты
  • Булевы объекты
  • Объекты модуля
  • Файловые объекты
  • Буферные объекты
  • Объект None

Скажите, какие другие встроенные типы вы проверили для isinstance(object, collections.Container), и я добавлю их в список.

4b9b3361

Ответ 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