docs: def dict_union3(dict1, dict2, combine_op=op.add):
      r"""
      Args:
          dict1 (dict):
          dict2 (dict):
          combine_op (func): (default=op.add)
  
      Returns:
          dict: mergedict_
  
      CommandLine:
          python -m utool.util_dict --exec-dict_union3
  
      Example:
          >>> # ENABLE_DOCTEST
          >>> from utool.util_dict import *  # NOQA
          >>> import utool as ut
          >>> dict1 = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
          >>> dict2 = {'b': 2, 'c': 3, 'd': 5, 'e': 21, 'f': 42}
          >>> combine_op = op.add
          >>> mergedict_ = dict_union3(dict1, dict2, combine_op)
          >>> result = ('mergedict_ = %s' % (ut.repr4(mergedict_, nl=False),))
          >>> print(result)
          mergedict_ = {'a': 1, 'b': 4, 'c': 6, 'd': 9, 'e': 21, 'f': 42}
      """
      keys1 = set(dict1.keys())
      keys2 = set(dict2.keys())
      # Combine common keys
      keys3 = keys1.intersection(keys2)
      if len(keys3) > 0 and combine_op is None:
          raise AssertionError('Can only combine disjoint dicts when combine_op is None')
      dict3 = {key: combine_op(dict1[key], dict2[key]) for key in keys3}
      # Combine unique keys
      for key in keys1.difference(keys3):
          dict3[key] = dict1[key]
      for key in keys2.difference(keys3):
          dict3[key] = dict2[key]
      return dict3