def METHOD_NAME(target: AAZDict, source: AAZDict, element_transformer=None):
    """ an convenience function to transform from a source AAZDictArg to a target AAZDictArg
    Example:
    args.target = assign_aaz_dict_arg(args.target, args.source, lambda key, e: {'name': key, "prop": e})
    """
    assert isinstance(target, AAZBaseValue)
    assert isinstance(source, AAZBaseValue)
    target_schema = target._schema
    source_schema = source._schema
    assert isinstance(target_schema, AAZDictArg)
    assert isinstance(source_schema, AAZDictArg)
    assert target_schema._nullable == source_schema._nullable, "Inconsist nullable property between target and " \
                                                               "source args"
    assert target_schema.Element._nullable == source_schema.Element._nullable, "Inconsist nullable property between " \
                                                                               "target element and source arg element"
    if not has_value(source):
        return target
    if source == None:  # noqa: E711, pylint: disable=singleton-comparison
        return None
    if not source._is_patch:
        # return the whole array
        data = {}
        for key, element in source.items():
            if not has_value(element):
                continue
            if element == None:  # noqa: E711, pylint: disable=singleton-comparison
                data[key] = None
            elif element_transformer:
                data[key] = element_transformer(key, element)
            else:
                data[key] = element
        return data
    # assign by patch way
    for key, element in source.items():
        if not has_value(element):
            continue
        if element == None:  # noqa: E711, pylint: disable=singleton-comparison
            target[key] = None
        elif element_transformer:
            target[key] = element_transformer(key, element)
        else:
            target[key] = element
    return target