I'm utilising a package which returns a nested dictionary. It feels awkward to access this return object in my class methods with the dictionary syntax, when everything else is in object syntax. Searching has brought me to the bunch / neobunch packages, which seems to achieve what I'm after. I've also seen namedtuples suggested but these do not easily support nested attributes and most solutions rely on using dictionaries within the namedtuple for nesting.
What would be a more natural way of achieving this?
data = {'a': 'aval', 'b': {'b1':{'b2a':{'b3a':'b3aval','b3b':'b3bval'},'b2b':'b2bval'}} }
print(data['b']['b1']['b2a']['b3b']) # dictionary access
# print(data.b.b1.b2a.b3b) # desired access
import neobunch
data1 = neobunch.bunchify(data)
print(data1.b.b1.b2a.b3b)
What about using
__setattr__
method ?The following class would let you do what you want:
Building on @martineau's excellent answer, you can make the AttrDict class to work on nested dictionaries without explicitly calling the from_nested_dict() function:
A simple class, built on the basic object can be used:
I am borrowing the
argparse.Namespace
definition, tweaked to allow for nesting.It would be used as
It could also have been defined with
**kwargs
(along with*args
). A__repr__
definition might be nice as well.As with other simple objects, attributes can be added, e.g.
f.c = f
(a recursive definition).vars(f)
returns a dictionary, though it does not do any recursive conversion).