comparison configmix/__init__.py @ 13:24ba462b9b4b

Return the `default' argument when the given `user' argument is `None' and when it is the first call on merge
author Franz Glasner <f.glasner@feldmann-mg.com>
date Wed, 09 Mar 2016 11:43:18 +0100
parents aecb36d4025f
children 6a91db2c2469
comparison
equal deleted inserted replaced
12:0f64d640cba0 13:24ba462b9b4b
38 else: 38 else:
39 result[k] = deepcopy(v) 39 result[k] = deepcopy(v)
40 return result 40 return result
41 41
42 42
43 def merge(user, default): 43 def merge(user, default, _first=True):
44 """A simple (YAML-)tree merge. 44 """A simple (YAML-)tree merge.
45 45
46 From http://stackoverflow.com/questions/823196/yaml-merge-in-python 46 From http://stackoverflow.com/questions/823196/yaml-merge-in-python
47 47
48 .. note:: `_first` is an internal argument.
49
48 """ 50 """
51 if _first and (user is None):
52 return default
49 if isinstance(user, dict) and isinstance(default, dict): 53 if isinstance(user, dict) and isinstance(default, dict):
50 for k, v in default.items(): 54 for k, v in default.items():
51 if k not in user: 55 if k not in user:
52 user[k] = v 56 user[k] = v
53 else: 57 else:
54 user[k] = merge(user[k], v) 58 user[k] = merge(user[k], v, False)
55 return user 59 return user
56 60
57 61
58 def safe_merge(user, default): 62 def safe_merge(user, default, _first=True):
59 """A more safe version of `merge()` that makes shallow copies of 63 """A more safe version of `merge()` that makes shallow copies of
60 the container objects. 64 the returned container objects.
65
66 .. note:: `_first` is an internal argument.
61 67
62 """ 68 """
69 if _first and (user is None):
70 return copy.copy(default)
63 user = copy.copy(user) 71 user = copy.copy(user)
64 if isinstance(user, dict) and isinstance(default, dict): 72 if isinstance(user, dict) and isinstance(default, dict):
65 for k, v in default.items(): 73 for k, v in default.items():
66 if k not in user: 74 if k not in user:
67 user[k] = copy.copy(v) 75 user[k] = copy.copy(v)
68 else: 76 else:
69 user[k] = merge(user[k], v) 77 user[k] = merge(user[k], v, False)
70 return user 78 return user