def process_transform_funcs(trans_funcs, func_args=None, func_kwargs=None):
    """Process input of the apply_transform_funcs function.

    :param iterable trans_funcs: functions to apply, specified the function or a (function, args, kwargs) tuple
    :param dict func_args: function positional arguments, specified as (function, arguments tuple) pairs
    :param dict func_kwargs: function keyword arguments, specified as (function, kwargs dict) pairs
    :returns: transformation functions for apply_transform_funcs function
    :rtype: list
    """
    # copy function arguments and make sure they are in dictionaries
    func_args = dict(func_args) if func_args else {}
    func_kwargs = dict(func_kwargs) if func_kwargs else {}

    # loop over specified functions
    proc_funcs = []
    for func_spec in trans_funcs:
        # expand (func, args, kwargs) combinations
        try:
            func, args, kwargs = (func_spec, None, None) if isinstance(func_spec, str) else func_spec
        except TypeError:
            func, args, kwargs = func_spec, None, None
        except ValueError:
            raise ValueError('expected (func, args, kwargs) combination (got {!s})'.format(func_spec))

        # get positional arguments
        args_ = func_args.pop(func, None)
        if args is not None and args_ is not None:
            raise RuntimeError('arguments for "{!s}" in both "trans_funcs" and "func_args"'.format(func))
        args = tuple(args) if args is not None else tuple(args_) if args_ is not None else ()

        # get keyword arguments
        kwargs_ = func_kwargs.pop(func, None)
        if kwargs is not None and kwargs_ is not None:
            raise RuntimeError('keyword arguments for "{!s}" in both "trans_funcs" and "func_kwargs"'.format(func))
        kwargs = dict(kwargs) if kwargs is not None else dict(kwargs_) if kwargs_ is not None else {}

        # check if function is callable
        if not (isinstance(func, str) or callable(func)):
            raise TypeError('function "{!s}" is not callable'.format(func))

        # append function specification
        proc_funcs.append((func, args, kwargs))

    # check if all specified arguments were used
    if func_args:
        raise ValueError('unused function arguments specified: {!s}'.format(func_args))
    if func_kwargs:
        raise ValueError('unused function keyword arguments specified: {!s}'.format(func_kwargs))

    return proc_funcs