summaryrefslogtreecommitdiff
path: root/lib/utils/dotdict.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/utils/dotdict.py')
-rw-r--r--lib/utils/dotdict.py24
1 files changed, 17 insertions, 7 deletions
diff --git a/lib/utils/dotdict.py b/lib/utils/dotdict.py
index 12cf6e79..47f56623 100644
--- a/lib/utils/dotdict.py
+++ b/lib/utils/dotdict.py
@@ -3,6 +3,7 @@
# Copyright (c) 2010 Authors
# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
+
class DotDict(dict):
"""A dict subclass that allows accessing methods using dot notation.
@@ -10,24 +11,33 @@ class DotDict(dict):
"""
def __init__(self, *args, **kwargs):
- super(DotDict, self).__init__(*args, **kwargs)
+ super().__init__(*args, **kwargs)
self._dotdictify()
def update(self, *args, **kwargs):
- super(DotDict, self).update(*args, **kwargs)
+ super().update(*args, **kwargs)
self._dotdictify()
def _dotdictify(self):
for k, v in self.items():
- if isinstance(v, dict):
+ if isinstance(v, dict) and not isinstance(v, DotDict):
self[k] = DotDict(v)
- __setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__
+ def __setattr__(self, name, value):
+ if name.startswith('_'):
+ super().__setattr__(name, value)
+ else:
+ if isinstance(value, dict) and not isinstance(value, DotDict):
+ value = DotDict(value)
+
+ super().__setitem__(name, value)
+
def __getattr__(self, name):
if name.startswith('_'):
- raise AttributeError("'DotDict' object has no attribute '%s'" % name)
+ raise AttributeError(
+ f"'{self.__class__.__name__}' object has no attribute '{name}'")
if name in self:
return self.__getitem__(name)
@@ -37,5 +47,5 @@ class DotDict(dict):
return new_dict
def __repr__(self):
- super_repr = super(DotDict, self).__repr__()
- return "DotDict(%s)" % super_repr
+ super_repr = super().__repr__()
+ return f"{self.__class__.__name__}({super_repr})"