dict - ¿Qué son exactamente los "contenedores" en python?(¿Y cuáles son todos los tipos de contenedores de Python?)
python dict (3)
Los contenedores son cualquier objeto que contiene una cantidad arbitraria de otros objetos. En general, los contenedores proporcionan una forma de acceder a los objetos contenidos y de iterar sobre ellos.
Los ejemplos de contenedores incluyen tuple
, list
, set
, dict
; estos son los contenedores integrados . Hay más tipos de contenedores disponibles en el módulo de collections
.
Estrictamente hablando, la clase base abstracta de collections.abc.Container
( collections.Container
en Python2) se cumple para cualquier tipo que admita el operador in
mediante el método __contains__
magic; así que si puedes escribir x in y
entonces y
suele ser un contenedor, pero no siempre: un punto importante de diferencia entre los contenedores y los iterables generales es que cuando se vuelven a iterar, los contenedores devolverán los objetos existentes a los que tienen referencia, mientras que los generadores y por ejemplo, file
objetos de file
crearán un nuevo objeto cada vez. Esto tiene implicaciones para la recolección de basura y el recorrido profundo de objetos (por ejemplo, deepcopy
y serialización).
Como ejemplo, iter(lambda: random.choice(range(6)), 0)
admite el operador in
, pero ciertamente no es un contenedor.
La intención de la clase base abstracta Collections.abc.Container
en solo considerar el método mágico __contains__
y no en otras formas de respaldar al operador in
es que un contenedor verdadero debería ser capaz de probar la contención en una sola operación y sin cambiar visiblemente el estado interno . Como Collections.abc.Container
define __contains__
como un método abstracto, se le garantiza que si isinstance(x, collections.abc.Container)
entonces x
admite el operador in
.
En la práctica, entonces, todos los contenedores tendrán el método mágico __contains__
. Sin embargo, cuando se prueba si un objeto es un contenedor, se debe usar isinstance(x, collections.abc.Container)
para mayor claridad y para la compatibilidad con versiones posteriores si alguna vez se cambiara la verificación de la subclase del Container
.
La documentación de Python frecuentemente habla de "contenedores". E.g. :
Si check_circular es False (valor predeterminado: True), se omitirá la referencia circular de los tipos de contenedor y una referencia circular dará como resultado un OverflowError (o algo peor).
Pero no puedo encontrar ninguna definición oficial de contenedores, ni una lista de ellos.
Editar
Para Python 2.7.3:
Tipos integrados comprobados que son contenedores:
( isinstance(object, collections.Container)
devuelve True
)
Contenedores que tienen definido un método
__contains__
:- Todos los tipos de secuencia incorporados: listas, bytearrays, cadenas, cadenas Unicode y tuplas.
- Diccionarios
- Todos los tipos de conjuntos integrados: conjuntos y conjuntos congelados
Contenedores que no tienen definido un método
__contains__
:- objetos xrange
Tipos incorporados comprobados que no son contenedores:
( isinstance(object, collections.Container)
devuelve False
):
- Objetos int
- Objetos flotantes
- Objetos largos
- Objetos booleanos
- Objetos del módulo
- Objetos de archivo
- Objetos de memoria intermedia
- El objeto None
Dígame qué otros tipos de isinstance(object, collections.Container)
incorporados ha comprobado para isinstance(object, collections.Container)
y los isinstance(object, collections.Container)
a la lista.
Los contenedores son todos objetos de pitón que contienen otros objetos como list
o dict
. El tipo de Container
es un ABC, se comporta como una interfaz. Un contenedor es una clase que implementa el método __contains__
.
Aquí está el doc
Según http://docs.python.org/dev/library/collections.abc.html#module-collections.abc , la definición más general de un contenedor es simplemente un objeto que implementa __contains__
. En general, los conceptos de Python como "contenedor" o "secuencia" no se definen de manera abstracta; son "de pato" por su comportamiento. Es decir, un contenedor es algo en lo que puede usar el operador in.
Los tipos de contenedor incorporado de Python son tuple, list, dict, set, frozenset y str y unicode (o bytes y str en Python 3), así como otras construcciones que son técnicamente tipos pero que no se usan comúnmente fuera de contextos específicos ( por ejemplo, objetos de buffer y objetos de xrange). Se proporcionan tipos de contenedores adicionales en el módulo de collections
.