docs: def dict_take_gen(dict_, keys, *d):
      r"""
      generate multiple values from a dictionary
  
      Args:
          dict_ (dict):
          keys (list):
  
      Varargs:
          d: if specified is default for key errors
  
      CommandLine:
          python -m utool.util_dict --test-dict_take_gen
  
      Example1:
          >>> # ENABLE_DOCTEST
          >>> from utool.util_dict import *  # NOQA
          >>> import utool as ut
          >>> dict_ = {1: 'a', 2: 'b', 3: 'c'}
          >>> keys = [1, 2, 3, 4, 5]
          >>> result = list(dict_take_gen(dict_, keys, None))
          >>> result = ut.repr4(result, nl=False)
          >>> print(result)
          ['a', 'b', 'c', None, None]
  
      Example2:
          >>> # ENABLE_DOCTEST
          >>> from utool.util_dict import *  # NOQA
          >>> dict_ = {1: 'a', 2: 'b', 3: 'c'}
          >>> keys = [1, 2, 3, 4, 5]
          >>> try:
          >>>     print(list(dict_take_gen(dict_, keys)))
          >>>     result = 'did not get key error'
          >>> except KeyError:
          >>>     result = 'correctly got key error'
          >>> print(result)
          correctly got key error
      """
      if isinstance(keys, six.string_types):
          # hack for string keys that makes copy-past easier
          keys = keys.split(', ')
      if len(d) == 0:
          # no default given throws key error
          dictget = dict_.__getitem__
      elif len(d) == 1:
          # default given does not throw key erro
          dictget = dict_.get
      else:
          raise ValueError('len(d) must be 1 or 0')
      for key in keys:
          if HAVE_NUMPY and isinstance(key, np.ndarray):
              # recursive call
              yield list(dict_take_gen(dict_, key, *d))
          else:
              yield dictget(key, *d)