Python: compruebe si la variable es un diccionario

En Python, podemos usar estas dos formas de verificar si una variable dada es un diccionario: la función type() y el operador is; y la función isinstance()

Introducción

Las variables actúan como un contenedor para almacenar datos. Un desarrollador puede usar sugerencias de tipo al crear variables o pasar argumentos, sin embargo, esa es una característica opcional en Python, y muchas bases de código, antiguas y nuevas, aún no las tienen. Es más común que una variable en Python no tenga información del tipo que se almacena.

Si tuviéramos un código que necesitaba un diccionario pero carecía de sugerencias de tipo, ¿cómo podemos evitar errores si la variable utilizada no es un diccionario?

En este tutorial, veremos cómo comprobar si una variable es un diccionario en Python, utilizando las funciones type() y isinstance(), así como el operador is:

Los desarrolladores suelen usar type() y is, aunque estos pueden estar limitados en ciertos contextos, en cuyo caso, es mejor usar la función isinstance().

Comprobar si la variable es un diccionario con type()

Podemos usar la función type() para obtener instantáneamente el tipo de cualquier variable. Para una variable de tipo Diccionario, debe devolver <clase 'dict'>:

1
2
squares = {1: 1, 2: 4, 3: 9}
print(type(squares))

Esto resulta en:

1
<class 'dict'>

Verificar si la variable es un diccionario con el operador es {#verificar si la variable es un diccionario con un operador}

En Python, is es un operador de identidad. Verifica si ambos operandos son idénticos entre sí. Ser idénticos indica que se refieren a la misma ubicación de memoria.

Podemos usar el operador is con el resultado de una llamada type() con una variable y la clase dict. Mostrará True solo si type() apunta a la misma ubicación de memoria que la clase dict. De lo contrario, generará Falso.

Como control de cordura, podemos usar la función id() para obtener la dirección del objeto en la memoria y verificar la comparación:

1
2
3
4
squares = {1: 1, 2: 4, 3: 9}
print(type(squares) is dict)  # True
print("memory address of type(squares):", id(type(squares)))
print("memory address of dict:", id(dict))  # Should have same ID as type(squares)

Este código producirá el siguiente resultado en un intérprete de Python:

1
2
3
True
memory address of type(squares): 1609576584
memory address of dict: 1609576584

Nota: La dirección de la memoria puede variar para usted, pero la misma ID debe estar presente tanto para type(squares) como para dict.

Una advertencia de este método es que no funciona si la variable es un tipo que es una subclase de dict. Por ejemplo, el código anterior no funcionaría si la variable cuadrados fuera un Diccionario ordenado en su lugar:

1
2
3
4
5
6
from collections import OrderedDict

squares = OrderedDict([(1, 1), (2, 4), (3, 9)])
print(type(squares) is dict)  # False
print("memory address of type(squares):", id(type(squares)))
print("memory address of dict:", id(dict))  # Different ID as they're different classes

Esto da como resultado:

1
2
3
False
memory address of type(squares): 9464512
memory address of dict: 9481952

Si se requiere que su código funcione en subclases de Diccionarios, entonces preferiría usar el método isinstance().

Comprobar si la variable es un diccionario con isinstance()

Como hemos visto, el operador ’es’ devolverá ‘Verdadero’ cuando la dirección de memoria de ambos objetos sea la misma. Si tenemos un Diccionario de tipo heredado de la clase dict, devolverá False. Por ejemplo, un diccionario de una subclase de dict como OrderedDict o defaultdict no apuntará a la misma dirección de memoria que dict.

Aquí tenemos la función isinstance() al rescate. Esta función toma dos argumentos; un objeto y una clase. Si el objeto es una instancia de la clase o sus subclases, devolverá Verdadero. Si el objeto no es una instancia de la clase dada, ya sea directa o indirecta, devuelve False.

Aquí hay un ejemplo de código para comprobar si la variable es un diccionario usando la función isinstance():

1
2
3
4
5
6
7
8
9
from collections import OrderedDict

# Variable of type dict
squares = {1: 1, 2: 4, 3: 9}
print(isinstance(squares, dict))  # True

# Variable of type OrderedDict (Subclass of dict)
cubes = OrderedDict(((1, 1), (2, 8)))
print(isinstance(cubes, dict))  # True

Este código producirá el siguiente resultado en un intérprete de Python:

1
2
True
True

Conclusión

Este tutorial mostró formas en las que podemos comprobar si una variable es un diccionario. Primero hemos visto la función type() que genera <class 'dict'> para cualquier objeto Dictionary. Luego hemos visto el uso del operador ’es’ para verificar si el tipo de variable apunta a ‘dict’ en la ubicación de memoria. Esto devuelve Verdadero o Falso según corresponda.

Por último, hemos visto que is falla al identificar objetos de diccionario heredados. Cuando queremos capturar objetos heredados, podemos usar la función isinstance(). Devuelve Verdadero si el objeto es directa o indirectamente una instancia de la clase dada (dict en este artículo), y Falso en caso contrario.

Como ambos métodos devuelven Verdadero o Falso, podemos usarlos fácilmente en declaraciones condicionales. A menos que desee rechazar explícitamente las subclases de dict, la función isinstance() es la forma más confiable de verificar si una variable es un diccionario.