docs: def chr_range(*args, **kw):
      r"""
      Like range but returns characters
  
      Args:
          start (None): (default = None)
          stop (None): (default = None)
          step (None): (default = None)
  
      Kwargs:
          base (str): charater to start with (default='a')
  
      Returns:
          list: list of characters
  
      CommandLine:
          python -m utool.util_str --exec-chr_range
  
      Example:
          >>> # ENABLE_DOCTEST
          >>> from utool.util_str import *  # NOQA
          >>> import utool as ut
          >>> args = (5,)
          >>> result = ut.repr2(chr_range(2, base='a'))
          >>> print(chr_range(0, 5))
          >>> print(chr_range(0, 50))
          >>> print(chr_range(0, 5, 2))
          >>> print(result)
          ['a', 'b']
      """
      if len(args) == 1:
          stop, = args
          start, step = 0, 1
      elif len(args) == 2:
          start, stop = args
          step = 1
      elif len(args) == 3:
          start, stop, step = args
      else:
          raise ValueError('incorrect args')
  
      chr_ = six.unichr
  
      base = ord(kw.get('base', 'a'))
      if isinstance(start, int):
          start = base + start
      if isinstance(stop, int):
          stop = base + stop
  
      if isinstance(start, six.string_types):
          start = ord(start)
      if isinstance(stop, six.string_types):
          stop = ord(stop)
      if step is None:
          step = 1
      list_ = list(map(six.text_type, map(chr_, range(start, stop, step))))
      return list_