docs: 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)