web-dev-qa-db-fra.com

Que sont exactement les "conteneurs" en python? (Et quels sont tous les types de conteneurs python?)

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.

Modifier

Pour Python 2.7.3:

Types intégrés vérifiés qui sont des conteneurs:

(isinstance(object, collections.Container) renvoie True)

  1. Conteneurs qui ont une méthode __contains__ Définie:

    • Tous les types de séquence intégrés: listes, sous-tableaux, chaînes, chaînes unicode et tuples.
    • Dictionnaires
    • Tous les types de set intégrés: sets et frozensets
  2. Conteneurs pour lesquels aucune méthode __contains__ N'est définie:

    • objets xrange

Types intégrés vérifiés qui ne sont pas des conteneurs:

(isinstance(object, collections.Container) renvoie False):

  • Objets int
  • Objets flottants
  • Objets longs
  • Objets booléens
  • Objets du module
  • Objets fichier
  • Objets tampons
  • L'objet None

Dites-moi quels autres types intégrés vous avez vérifié pour isinstance(object, collections.Container) et je les ajouterai à la liste.

53
Bentley4

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.

79
ecatmur

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.

5
BrenBarn

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

0
NoZip