def partial(f):
    """
    Create a function that can be partially applied similar to currying.

    Note that different from currying, this function object must be partially
    applied exactly once, even if all the arguments are given, or it has no
    arguments at all.

    This can be used as a decorator as well.

    Args:
        f: The function to transform into a partially applied function object.

    Returns:
        The transformed function which must be partially applied at least once.
    """
    def c(*args, **kwargs):
        def inner(*other_args, **other_kwargs):
            return f(*args, *other_args, **kwargs, **other_kwargs)

        return inner

    return c