Saltar al contenido

¿Cómo validar la estructura (o esquema) del diccionario en Python?

Este tutorial ha sido analizado por especialistas así garantizamos la exactitud de nuestra esta reseña.

Solución:

Puedes utilizar schema (Enlace PyPi)

esquema es una biblioteca para validar estructuras de datos de Python, como las obtenidas de archivos de configuración, formularios, servicios externos o análisis de línea de comandos, convertidas de JSON/YAML (o algo más) a tipos de datos de Python.

from schema import Schema, And, Use, Optional, SchemaError

def check(conf_schema, conf):
    try:
        conf_schema.validate(conf)
        return True
    except SchemaError:
        return False

conf_schema = Schema(
    'version': And(Use(int)),
    'info': 
        'conf_one': And(Use(float)),
        'conf_two': And(Use(str)),
        'conf_three': And(Use(bool)),
        Optional('optional_conf'): And(Use(str))
    
)

conf = 
    'version': 1,
    'info': 
        'conf_one': 2.5,
        'conf_two': 'foo',
        'conf_three': False,
        'optional_conf': 'bar'
    


print(check(conf_schema, conf))

Sin usar bibliotecas, también podría definir una función recursiva simple como esta:

def check_structure(struct, conf):
    if isinstance(struct, dict) and isinstance(conf, dict):
        # struct is a dict of types or other dicts
        return all(k in conf and check_structure(struct[k], conf[k]) for k in struct)
    if isinstance(struct, list) and isinstance(conf, list):
        # struct is list in the form [type or dict]
        return all(check_structure(struct[0], c) for c in conf)
    elif isinstance(struct, type):
        # struct is the type of conf
        return isinstance(conf, struct)
    else:
        # struct is neither a dict, nor list, not type
        return False

Esto supone que la configuración puede tener keys que no están en tu estructura, como en tu ejemplo.


Actualización: la nueva versión también admite listas, por ejemplo, como 'foo': ['bar': int]

valoraciones y reseñas

Recuerda que tienes el privilegio parafrasear si te fue útil.

¡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 *