def first_or_none(predicate, lst): return next((x for x in lst if predicate(x)), None) def deep_merge(source, destination: dict): """ Merge source dict into destination dict recursively. """ def _deep_merge(a, b): for key, value in a.items(): if isinstance(value, dict): node = b.setdefault(key, {}) _deep_merge(value, node) else: b[key] = value return b return _deep_merge(source, dict(destination))