Search code examples
pythonvalidationdictionaryschemaconfig

How to validate structure (or schema) of dictionary in Python?


I have a dictionary with config info:

my_conf = {
    'version': 1,

    'info': {
        'conf_one': 2.5,
        'conf_two': 'foo',
        'conf_three': False,
        'optional_conf': 'bar'
    }
}

I want to check if the dictionary follows the structure I need.

I'm looking for something like this:

conf_structure = {
    'version': int,

    'info': {
        'conf_one': float,
        'conf_two': str,
        'conf_three': bool
    }
}

is_ok = check_structure(conf_structure, my_conf)

Is there any solution done to this problem or any library that could make implementing check_structure more easy?


Solution

  • Without using libraries, you could also define a simple recursive function like this:

    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(conf, type):
            # struct is the type of conf
            return isinstance(struct, conf)
        else:
            # struct is neither a dict, nor list, not type
            return False
    

    This assumes that the config can have keys that are not in your structure, as in your example.


    Update: New version also supports lists, e.g. like 'foo': [{'bar': int}]