Still think the exec is ugly and bad.
I think this is pretty clean way to set from a list:
And for a possibly more convenient API:
I think this is pretty clean way to set from a list:
from collections import defaultdict def DynamicNestedDict(): return defaultdict(DynamicNestedDict) def try_dynamic_nested_dict(): keylist = ['bind', 'application level', 'binding'] loc = [20, 96, 100, 101, 102, 104, 105, 115, 193, 434, 546] dd = DynamicNestedDict() level = dd for key in keylist[:-1]: level = level[key] level[keylist[-1]] = loc print("dd['bind']['application level']['binding']: {}" .format(dd['bind']['application level']['binding'])) if __name__ == '__main__': try_dynamic_nested_dict()Edit:
And for a possibly more convenient API:
from collections import defaultdict class DynamicNestedDict(defaultdict): def __init__(self, *args, **kwargs): super(DynamicNestedDict, self).__init__(DynamicNestedDict, *args, **kwargs) def set_from_list(self, keylist, value): level = self for key in keylist[:-1]: level = level[key] level[keylist[-1]] = value def get_from_list(self, keylist): level = self for key in keylist[:-1]: level = level[key] return level[keylist[-1]] def try_dynamic_nested_dict(): keylist = ['bind', 'application level', 'binding'] loc = [20, 96, 100, 101, 102, 104, 105, 115, 193, 434, 546] dd = DynamicNestedDict() dd.set_from_list(keylist, loc) result = dd.get_from_list(keylist) print("dd['bind']['application level']['binding']: {}".format(result)) if __name__ == '__main__': try_dynamic_nested_dict()Testing certainly needed.