docs: def _recursive_merge(dct, merge_dct, raise_on_missing):
      # type: (Dict[str, Any], Dict[str, Any], bool) -> Dict[str, Any]
      """Recursive dict merge
  
      This modifies `dct` in place. Use `copy.deepcopy` if this behavior is not desired.
      """
      for k, v in merge_dct.items():
          if k in dct:
              if isinstance(dct[k], dict) and isinstance(merge_dct[k], BaseMapping):
                  dct[k] = _recursive_merge(dct[k], merge_dct[k], raise_on_missing)
              else:
                  dct[k] = merge_dct[k]
          elif isinstance(dct, Extensible):
              dct[k] = merge_dct[k]
          else:
              message = "Unknown configuration key: '{k}'".format(k=k)
              if raise_on_missing:
                  raise KeyError(message)
              else:
                  logging.getLogger(__name__).warning(message)
  
      return dct