Browse Source

dict_merge(): overwrite lists by default

Otherwise lists, i.e. the clients array per node, gets
larger and larger as only new items are added to it.
Helge Jung 9 years ago
parent
commit
ec3068544f
1 changed files with 14 additions and 7 deletions
  1. 14 7
      ffstatus/__init__.py

+ 14 - 7
ffstatus/__init__.py

@@ -31,7 +31,7 @@ def mac2id(mac):
     return mac.lower().replace(':', '')
 
 
-def dict_merge(a, b):
+def dict_merge(a, b, overwrite_lists=True):
     '''recursively merges dict's. not just simple a['key'] = b['key'], if
     both a and bhave a key who's value is a dict then dict_merge is called
     on both values and the result stored in the returned dictionary.'''
@@ -39,12 +39,19 @@ def dict_merge(a, b):
         return b
     result = deepcopy(a)
     for k, v in b.iteritems():
-        if k in result and isinstance(result[k], dict):
-            result[k] = dict_merge(result[k], v)
-        elif k in result and isinstance(result[k], list):
-            result[k] = result[k] + [deepcopy(x) for x in v if x not in result[k]]
-        else:
-            result[k] = deepcopy(v)
+        if k in result:
+            if isinstance(result[k], dict):
+                result[k] = dict_merge(result[k], v)
+                continue
+
+            if isinstance(result[k], list):
+                if overwrite_lists:
+                    result[k] = [deepcopy(x) for x in v]
+                else:
+                    result[k] = [deepcopy(x) for x in v if x not in result[k]]
+                continue
+
+        result[k] = deepcopy(v)
     return result