Saltar al contenido

¿Cómo verificar si una variable es un diccionario en Python?

Posterior a observar en varios repositorios y páginas webs de internet al final hemos descubierto la resolución que te compartiremos pronto.

Solución:

podrías usar if type(ele) is dict o usar isinstance(ele, dict) que funcionaría si hubiera subclasificado dict:

d = 'abc': 'abc', 'def': 'ghi': 'ghi', 'jkl': 'jkl'
for element in d.values():
    if isinstance(element, dict):
       for k, v in element.items():
           print(k,' ',v)

¿Cómo verificaría si una variable es un diccionario en Python?

Esta es una excelente pregunta, pero es desafortunado que la respuesta más votada conduzca a una mala recomendación. type(obj) is dict.

(Tenga en cuenta que tampoco debe usar dict como nombre de variable – es el nombre del objeto integrado.)

Si está escribiendo código que será importado y utilizado por otros, no asuma que usarán el dictado incorporado directamente; hacer esa presunción hace que su código sea más inflexible y, en este caso, cree errores fácilmente ocultos que no provocarían errores en el programa. .

Sugiero enfáticamente, con el propósito de corrección, mantenibilidad y flexibilidad para los usuarios futuros, nunca tener expresiones unidiomáticas menos flexibles en su código cuando hay expresiones idiomáticas más flexibles.

is es una prueba para la identidad del objeto. No admite la herencia, no admite ninguna abstracción y no admite la interfaz.

Así que voy a proporcionar varias opciones que lo hacen.

Herencia de apoyo:

Esta es la primera recomendación que haría, porque permite a los usuarios proporcionar su propia subclase de dict, o una OrderedDict, defaultdicto Counter desde el módulo de colecciones:

if isinstance(any_object, dict):

Pero hay opciones aún más flexibles.

Abstracciones de apoyo:

from collections.abc import Mapping

if isinstance(any_object, Mapping):

Esto le permite al usuario de su código usar su propia implementación personalizada de un Mapeo abstracto, que también incluye cualquier subclase de dicty aún obtener el comportamiento correcto.

Usa la interfaz

Comúnmente escucha el consejo de programación orientada a objetos, “programa a una interfaz”.

Esta estrategia aprovecha el polimorfismo de Python o la tipificación pato.

Así que simplemente intente acceder a la interfaz, capturando los errores esperados específicos (AttributeError en caso de que no haya .items y TypeError en caso items no se puede llamar) con un respaldo razonable, y ahora cualquier clase que implemente esa interfaz le dará sus elementos (nota .iteritems() se ha ido en Python 3):

try:
    items = any_object.items()
except (AttributeError, TypeError):
    non_items_behavior(any_object)
else: # no exception raised
    for item in items: ...

Tal vez podría pensar que usar tipos de pato como este va demasiado lejos al permitir demasiados false positivos, y puede ser, dependiendo de sus objetivos para este código.

Conclusión

no usar is para comprobar los tipos de flujo de control estándar. Utilizar isinstanceconsidere abstracciones como Mapping o MutableMappingy considere evitar la verificación de tipos por completo, usando la interfaz directamente.

El OP no excluyó la variable de inicio, por lo que para completar, aquí se explica cómo manejar el caso genérico de procesar un supuesto diccionario que puede incluir elementos como diccionarios.

También siguiendo la forma recomendada de Python puro (3.8) para probar el diccionario en los comentarios anteriores.

from collections.abc import Mapping

dict = 'abc': 'abc', 'def': 'ghi': 'ghi', 'jkl': 'jkl'

def parse_dict(in_dict): 
    if isinstance(in_dict, Mapping):
        for k_outer, v_outer in in_dict.items():
            if isinstance(v_outer, Mapping):
                for k_inner, v_inner in v_outer.items():
                    print(k_inner, v_inner)
            else:
                print(k_outer, v_outer)

parse_dict(dict)

Aquí puedes ver las comentarios y valoraciones de los lectores

Te invitamos a confirmar nuestra publicación poniendo un comentario o valorándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *