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?
Advertisement
Answer
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}]