diff --git a/LCS/PyCommon/util.py b/LCS/PyCommon/util.py index 4177e3454671a9479aa14d41586159acdf9546af..470015ab1da8a0f553ad4b5b52e8d9fbaaa3849e 100644 --- a/LCS/PyCommon/util.py +++ b/LCS/PyCommon/util.py @@ -27,6 +27,7 @@ This package contains different utilities that are common for LOFAR software import sys import os, os.path import time +from copy import deepcopy def check_bit(value, bit): @@ -220,15 +221,15 @@ def find_free_port(preferred_port: int=0, allow_reuse_of_lingering_port: bool=Tr return s.getsockname()[1] -def dict_search_and_replace(d: dict, key, value): - '''perform an in-place search-and-replace to replace all items for the given key by the given value''' - if key in d: - d[key] = value - # recurse over nested items. - for k in d: - if isinstance(d[k], dict): - dict_search_and_replace(d[k], key, value) - elif isinstance(d[k], list): - for i in d[k]: - if isinstance(i, dict): - dict_search_and_replace(i, key, value) +def dict_with_overrides(org_dict: dict, overrides_dict: dict) -> dict: + '''return a copy of the original (nested) org_dict with all (nested) key/value pairs in the overrides_dict applied''' + new_dict = deepcopy(org_dict) + for override_key, override_value in overrides_dict.items(): + # recurse + if isinstance(override_value, dict): + new_dict[override_key] = dict_with_overrides(org_dict.get(override_key,{}), override_value) + else: + new_dict[override_key] = override_value + + return new_dict +