Normally print function in python prints values to a stream / stdout
    >> print(value1, value2, sep='', end='\n', file=sys.stdout)

    Current package usage:
    ======================
    print(value1, value2, sep='', end='\n', file=sys.stdout, color=None,
    bg_color=None, text_format=None, log_type=None)

    :param args: Values (str) to print
    :param kwargs: Text formats like sep, end, color, background, text format, log type (ERROR, INFO, WARNING, DEBUG)
    :return: Colored text to stdout (Console)

def print(*args, **kwargs):
    """
    Normally print function in python prints values to a stream / stdout
    >> print(value1, value2, sep='', end='\n', file=sys.stdout)

    Current package usage:
    ======================
    print(value1, value2, sep='', end='\n', file=sys.stdout, color=None,
    bg_color=None, text_format=None, log_type=None)

    :param args: Values (str) to print
    :param kwargs: Text formats like sep, end, color, background, text format, log type (ERROR, INFO, WARNING, DEBUG)
    :return: Colored text to stdout (Console)
    """

    # Pop out color and background values from kwargs
    color_name = kwargs.pop('color', None)
    bg_color = kwargs.pop('bg_color', None)
    log_type = kwargs.pop('log_type', None)

    # Check formats, create a list of text formats
    txt_formats = kwargs.pop('text_format', [])
    if sys.version_info[0] == 2:
        str_type = basestring
    elif sys.version_info[0] == 3:
        str_type = str
    else:
        str_type = basestring
    if isinstance(txt_formats, str_type):
        txt_formats = [txt_formats]

    # Check for file keyword
    file_name = kwargs.get('file', sys.stdout)

    # Check for foreground and background colors
    if color_name or bg_color or log_type:
        # Pop out the 'end' argument
        end_ = kwargs.pop('end', "\n")
        kwargs['end'] = ""

        # If log type argument is provided
        if log_type:
            if log_type not in log_types.keys():
                print('Log type not valid!', log_type='error')
                sys.exit(1)
            if log_type == 'info':
                __builtin__.print('\033[{}m[INF] '.format(foreground_colors[log_types[log_type]]), file=file_name, end='')
                __builtin__.print('\033[0m', file=file_name, end='')
            if log_type == 'warn':
                __builtin__.print('\033[{}m[WRN] '.format(foreground_colors[log_types[log_type]]), file=file_name, end='')
                __builtin__.print('\033[0m', file=file_name, end='')
            if log_type == 'error':
                __builtin__.print('\033[{}m[ERR] '.format(foreground_colors[log_types[log_type]]), file=file_name, end='')
                __builtin__.print('\033[0m', file=file_name, end='')
            if log_type == 'hint':
                __builtin__.print('\033[{}m[HNT] '.format(foreground_colors[log_types[log_type]]), file=file_name, end='')
                __builtin__.print('\033[0m', file=file_name, end='')
            if log_type == 'debug':
                __builtin__.print('\033[{}m[DBG] '.format(foreground_colors[log_types[log_type]]), file=file_name, end='')
                __builtin__.print('\033[0m', file=file_name, end='')

        # If foreground color argument is provided
        if color_name:
            if color_name not in foreground_colors.keys():
                print('Invalid color code!', log_type='error')
                sys.exit(1)
            __builtin__.print('\033[{}m'.format(foreground_colors[color_name]), file=file_name, end='')

        # If background color argument is provided
        if bg_color:
            if bg_color not in background_colors.keys():
                print('Invalid background color code!', log_type='error')
                sys.exit(1)
            __builtin__.print('\033[{}m'.format(background_colors[bg_color]), file=file_name, end='')

        # If text formats are provided
        for txt_format in txt_formats:
            __builtin__.print('\033[{}m'.format(text_formats[txt_format]), file=file_name, end='')
        # Print values
        __builtin__.print(*args, **kwargs)
        # Reset
        __builtin__.print('\033[0m',  file=file_name, end=end_)
    else:
        __builtin__.print(*args, **kwargs)