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}

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