46 lines
1.4 KiB
Python
46 lines
1.4 KiB
Python
class Attr_Dict (dict) :
|
|
|
|
def _convert_dict (self, o) :
|
|
return self.__class__ (o)
|
|
# end def _convert_dict
|
|
|
|
def _convert_sequence (self, o) :
|
|
result = []
|
|
for v in o :
|
|
if isinstance (v, (list, tuple)) :
|
|
result.append (self._convert_sequence (v))
|
|
elif isinstance (v, dict) :
|
|
result.append (self._convert_dict (v))
|
|
else :
|
|
result.append (v)
|
|
if isinstance (o, tuple) :
|
|
return tuple (result)
|
|
return result
|
|
# end def _convert_sequence
|
|
|
|
def __getitem__ (self, key) :
|
|
value = super ().__getitem__ (key)
|
|
if isinstance (value, dict) :
|
|
value = self [key] = self._convert_dict (value)
|
|
if isinstance (value, (tuple, list)) :
|
|
value = self [key] = self._convert_sequence (value)
|
|
return value
|
|
# end def __getitem__
|
|
|
|
def __getattr__ (self, name) :
|
|
try :
|
|
return self [name]
|
|
except KeyError :
|
|
raise AttributeError (name)
|
|
# end def __getattr__
|
|
|
|
def __setattr__ (self, name, value) :
|
|
self [name] = value
|
|
# end def __setattr__
|
|
|
|
# end class Attr_Dict
|
|
|
|
if __name__ == "__main__" :
|
|
a = Attr_Dict (a = {"b" : 1}, b = [{"a": 1}], c = ({"a" : 1}, ))
|
|
|
|
|