docs: def cat_colors(N: int = 1, *, hue: str = None, luminosity: str = None, bgvalue: int = None, loop: bool = False, seed: str = "cat") -> Union[List[Any], colors.LinearSegmentedColormap]:
  	"""
  	Return a colormap suitable for N categorical values, optimized to be both aesthetically pleasing and perceptually distinct.
  
  	Args:
  		N			The number of colors requested.
  		hue			Controls the hue of the generated color. You can pass a string representing a color name: "red", "orange", "yellow", "green", "blue", "purple", "pink" and "monochrome" are currently supported. If you pass a hexidecimal color string such as "#00FFFF", its hue value will be used to generate colors.
  		luminosity	Controls the luminosity of the generated color: "bright", "light" or "dark".
  		bgvalue		If not None, then the corresponding index color will be set to light gray
  		loop		If True, loop the color alphabet instead of generating random colors
  		seed		If not None, use as the random seed (default: "cat")
  	
  	Returns:
  		A set of colors in the requested format, either a list of values or a matplotlib LinearSegmentedColormap (when format="cmap")
  		If N <= 25 and hue and luminosity are both None, a subset of the optimally perceptually distinct "color alphabet" is returned.
  		Else, a pleasing set of random colors is returned.
  
  		Colors are designed to be displayed on a white background.
  	"""
  	c: List[str] = []
  	if N <= 25 and hue is None and luminosity is None:
  		c = _color_alphabet[:N]
  	elif not loop:
  		c = RandomColor(seed=seed).generate(count=N, hue=hue, luminosity=luminosity, format_="hex")
  	else:
  		n = N
  		while n > 0:
  			c += _color_alphabet[:n]
  			n -= 25
  	if bgvalue is not None:
  		c[bgvalue] = "#aaaaaa"
  	return colors.LinearSegmentedColormap.from_list("", c, N)