элемента - класс контейнер python




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

Контейнер - это все объекты python, которые содержат другие объекты, такие как list или dict . Тип Container - это ABC, он ведет себя как интерфейс. Контейнер - это класс, который реализует метод __contains__ .

Вот doc

Документация на python часто говорит о «контейнерах». E.g. :

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

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

редактировать

Для Python 2.7.3:

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

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

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

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

    • объекты xrange

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

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

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

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


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

Примеры контейнеров включают tuple , list , set , dict ; это встроенные контейнеры . В модуле collections доступны дополнительные типы контейнеров.

Строго говоря, абстрактный базовый класс collections.Container ( collections.Container Контейнер в Python2) выполняется для любого типа, который поддерживает оператор in помощью метода __contains__ magic; поэтому, если вы можете написать x in y то y обычно является контейнером, но не всегда: важной точкой разницы между контейнерами и общими итерами является то, что при повторении контейнеров контейнеры возвращают существующие объекты, на которые они ссылаются, тогда как генераторы и например, file объекты будут каждый раз создавать новый объект. Это имеет значение для сбора мусора и прохождения глубоких объектов (например, deepcopy глубокой deepcopy и сериализации).

Например, iter(lambda: random.choice(range(6)), 0) поддерживает оператор in , но это, конечно, не контейнер!

Цель абстрактного базового класса Collections.abc.Container только с __contains__ магического метода __contains__ а не других способов поддержки оператора in заключается в том, что истинный контейнер должен иметь возможность проверять сдерживание в одной операции и без видимого изменения внутреннего состояния , Поскольку Collections.abc.Container определяет __contains__ как абстрактный метод, вам гарантируется, что если isinstance(x, collections.abc.Container) то x поддерживает оператор in .

На практике все контейнеры будут иметь метод __contains__ magic. Однако при проверке того, является ли объект контейнером, вы должны использовать isinstance(x, collections.abc.Container) для ясности и для прямой совместимости, если проверка подкласса Container будет изменена.







containers