Mercurial > hgrepos > Python > libs > ConfigMix
comparison configmix/__init__.py @ 111:d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
configmix.safe_merge() does now a deepcopy of all source
configurations when merging. Changes in configuration instances after
will not be reflected in the merged configuration any more.
| author | Franz Glasner <hg@dom66.de> |
|---|---|
| date | Sat, 24 Mar 2018 18:47:54 +0100 |
| parents | 29cf359ddf4d |
| children | c50ad93eb5dc |
comparison
equal
deleted
inserted
replaced
| 110:29cf359ddf4d | 111:d51a18e5b0e3 |
|---|---|
| 122 user[k] = _merge(user[k], v) | 122 user[k] = _merge(user[k], v) |
| 123 return user | 123 return user |
| 124 | 124 |
| 125 | 125 |
| 126 def safe_merge(user, default): | 126 def safe_merge(user, default): |
| 127 """A more safe version of :func:`merge` that makes shallow copies of | 127 """A more safe version of :func:`merge` that makes deep copies of |
| 128 the returned container objects. | 128 the returned container objects. |
| 129 | |
| 130 No given argument is ever changed inplace. Every object from `default` | |
| 131 is decoupled from the result -- so changing the `default` configuration | |
| 132 lates does not yield into a merged configuration later. | |
| 129 | 133 |
| 130 """ | 134 """ |
| 131 if user is None: | 135 if user is None: |
| 132 return copy.copy(default) | 136 return copy.deepcopy(default) |
| 133 user = copy.copy(user) | 137 user = copy.deepcopy(user) |
| 134 if isinstance(user, dict) and isinstance(default, dict): | 138 if isinstance(user, dict) and isinstance(default, dict): |
| 135 for k, v in default.items(): | 139 for k, v in default.items(): |
| 136 if k not in user: | 140 if k not in user: |
| 137 user[k] = copy.copy(v) | 141 user[k] = copy.deepcopy(v) |
| 138 else: | 142 else: |
| 139 user[k] = _merge(user[k], v) | 143 user[k] = _safe_merge(user[k], v) |
| 140 return user | 144 return user |
| 145 | |
| 146 | |
| 147 def _safe_merge(user, default): | |
| 148 """Recursion helper for :meth:`safe_merge` | |
| 149 | |
| 150 """ | |
| 151 if isinstance(user, dict) and isinstance(default, dict): | |
| 152 for k, v in default.items(): | |
| 153 if k not in user: | |
| 154 user[k] = copy.deepcopy(v) | |
| 155 else: | |
| 156 user[k] = _safe_merge(user[k], v) | |
| 157 return user |
