La documentation python parle souvent de "conteneurs". Par exemple :
Si check_circular est False (par défaut: True), la vérification de référence circulaire pour les types de conteneurs sera ignorée et une référence circulaire entraînera une erreur OverflowError (ou pire).
Mais je ne trouve aucune définition officielle des conteneurs, ni une liste d'entre eux.
Pour Python 2.7.3:
Types intégrés vérifiés qui sont des conteneurs:
(isinstance(object, collections.Container)
renvoie True
)
Conteneurs qui ont une méthode __contains__
Définie:
Conteneurs pour lesquels aucune méthode __contains__
N'est définie:
Types intégrés vérifiés qui ne sont pas des conteneurs:
(isinstance(object, collections.Container)
renvoie False
):
Dites-moi quels autres types intégrés vous avez vérifié pour isinstance(object, collections.Container)
et je les ajouterai à la liste.
Les conteneurs sont tout objet contenant un nombre arbitraire d'autres objets. Généralement, les conteneurs permettent d'accéder aux objets contenus et de les parcourir.
Exemples de conteneurs: Tuple
, list
, set
, dict
; ce sont les conteneurs intégrés . D'autres types de conteneurs sont disponibles dans le module collections
.
Strictement parlant, la classe de base abstraite collections.abc.Container
( collections.Container
en Python2) est valable pour tout type prenant en charge le in
opérateur via la méthode magique __contains__
; donc si vous pouvez écrire x in y
alors y
est généralement un conteneur, mais pas toujours: un point important de différence entre conteneurs et général itérables est que lorsque itéré, les conteneurs reviendront objets existants auxquels ils font référence, tandis que les générateurs et par exemple file
les objets créeront un nouvel objet à chaque fois. Cela a des implications pour la récupération de place et la traversée profonde des objets (par exemple deepcopy
et sérialisation).
Par exemple, iter(lambda: random.choice(range(6)), 0)
supporte l'opérateur in
, mais ce n'est certainement pas pas un conteneur!
L'intention de la classe de base abstraite Collections.abc.Container
En ne prenant en compte que la méthode magique __contains__
Et non d'autres moyens de prendre en charge l'opérateur in
est qu'un véritable conteneur doit être en mesure de tester confinement en une seule opération et sans changement d'état interne observable. Puisque Collections.abc.Container
Définit __contains__
Comme une méthode abstraite, il est garanti que si isinstance(x, collections.abc.Container)
alors x
prend en charge l'opérateur in
.
En pratique, alors, tous les conteneurs auront la méthode magique __contains__
. Cependant, lorsque vous testez si un objet est un conteneur, vous devez utiliser isinstance(x, collections.abc.Container)
pour plus de clarté et pour la compatibilité ascendante si la vérification de la sous-classe Container
est modifiée.
Selon http://docs.python.org/dev/library/collections.abc.html#module-collections.abc , la définition la plus générale d'un conteneur est simplement un objet qui implémente __contains__
. En général, les concepts Python comme "conteneur" ou "séquence" ne sont pas définis de manière abstraite; ils sont "typés canard" par leur comportement. Autrement dit, un conteneur est quelque chose que vous pouvez utiliser in
opérateur activé.
Les types de conteneurs intégrés Python sont Tuple, list, dict, set, frozenset et str et unicode (ou bytes and str in Python 3), ainsi que quelques autres constructions qui sont techniquement des types mais qui ne sont pas couramment utilisées en dehors de contextes spécifiques (par exemple, des objets tampon et des objets xrange). Des types de conteneurs supplémentaires sont fournis dans le module collections
.
Les conteneurs sont tous des objets python qui contiennent d'autres objets comme list
ou dict
. Le type Container
est un ABC, il se comporte comme une interface Un conteneur est une classe qui implémente le __contains__
méthode.
Voici le doc