# Tool to merge complex dictionaries def Merge(in1Dict, in2Dict): """ Сливать словарь in2Dict в in1Dict. В случае конфликта вывести исключение :param in1Dict: Исходный словарь. В него будет производится запись. Ссылка на него будет активна :param in2Dict: Изменяющий словарь. Новые данные, которые будут скопированы в in1Dict :return: Обновленный словарь in1Dict """ lPathList=None if lPathList is None: lPathList = [] for lKeyStr in in2Dict: if lKeyStr in in1Dict: if isinstance(in1Dict[lKeyStr], dict) and isinstance(in2Dict[lKeyStr], dict): Merge(in1Dict[lKeyStr], in2Dict[lKeyStr]) elif in1Dict[lKeyStr] == in2Dict[lKeyStr]: pass # same leaf value else: raise Exception('Conflict at %s' % '.'.join(lPathList + [str(lKeyStr)])) else: in1Dict[lKeyStr] = in2Dict[lKeyStr] return in1Dict # Tool to merge complex dictionaries - no exceptions, just overwrite dict 2 in dict 1 def MergeNoException(in1Dict, in2Dict): """ Сливать словарь in2Dict в in1Dict. В случае конфликта перезаписать на значение из in2Dict :param in1Dict: Исходный словарь. В него будет производится запись. Ссылка на него будет активна :param in2Dict: Изменяющий словарь. Новые данные, которые будут скопированы в in1Dict :return: Обновленный словарь in1Dict """ lPathList=None if lPathList is None: lPathList = [] for lKeyStr in in2Dict: if lKeyStr in in1Dict: if isinstance(in1Dict[lKeyStr], dict) and isinstance(in2Dict[lKeyStr], dict): MergeNoException(in1Dict[lKeyStr], in2Dict[lKeyStr]) else: in1Dict[lKeyStr] = in2Dict[lKeyStr] else: in1Dict[lKeyStr] = in2Dict[lKeyStr] return in1Dict