Mercurial > hgrepos > Python > libs > ConfigMix
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 |
