def _extract_msg(args, kwargs, msg_idx, default_msg, non_msg_params):
    """Extracts the ``msg`` argument from the passed ``args``.

    Returns
    -------
    tuple
        The found ``msg``, the args and kwargs with that ``msg``
        removed, and any remaining positional args after ``msg``.
    """
    rem_args = []
    if 'msg' in kwargs:
        msg = kwargs.pop('msg')
    elif len(args) > non_msg_params and msg_idx < len(args):
        msg = args[msg_idx]
        if 0 <= msg_idx:
            rem_args = args[msg_idx + 1:]
        args = args[:msg_idx]
    else:
        msg = default_msg
    return msg, args, rem_args, kwargs
