# HG changeset patch # User Franz Glasner # Date 1457518760 -3600 # Node ID 58af59d5af404f75d1cd78bbd5e33781d326e239 # Parent 6835a5663008d3f8950a7cdeb9c227acdd1ce2e2 A "safe_merge" that makes (shallow) copies instead of directly manipulating given containers diff -r 6835a5663008 -r 58af59d5af40 configmix/__init__.py --- a/configmix/__init__.py Wed Mar 09 11:09:33 2016 +0100 +++ b/configmix/__init__.py Wed Mar 09 11:19:20 2016 +0100 @@ -6,11 +6,6 @@ See LICENSE for details. """ -# -# NOTE: ONLY STANDARDLIB-IMPORTS IN THIS MODULE. -# ITS JUST FOR BOOTSTRAPPING WITH PYTHON2 and PYTHON3. -# NO `future`, `six`, ... -# from __future__ import division, print_function, absolute_import @@ -18,6 +13,9 @@ __version__ = "0.0.dev0" +import copy + + __all__ = [] @@ -54,3 +52,18 @@ else: user[k] = merge(user[k], v) return user + + +def safe_merge(user, default): + """A more safe version of `merge()` that makes shallow copies of + the container objects. + + """ + user = copy.copy(user) + if isinstance(user, dict) and isinstance(default, dict): + for k, v in default.items(): + if k not in user: + user[k] = copy.copy(v) + else: + user[k] = merge(user[k], v) + return user