code: def _dict_from_lines(lines, key_nums, sep=None):
      
      if is_string(lines):
          lines = [lines]
  
      if not isinstance(key_nums, collections.abc.Iterable):
          key_nums = list(key_nums)
  
      if len(lines) != len(key_nums):
          err_msg = "lines = %s\n key_num =  %s" % (str(lines), str(key_nums))
          raise ValueError(err_msg)
  
      kwargs = Namespace()
  
      for (i, nk) in enumerate(key_nums):
          if nk == 0: continue
          line = lines[i]
  
          tokens = [t.strip() for t in line.split()]
          values, keys = tokens[:nk], "".join(tokens[nk:])
          # Sanitize keys: In some case we might get strings in the form: foo[,bar]
          keys.replace("[", "").replace("]", "")
          keys = keys.split(",")
  
          if sep is not None:
              check = keys[0][0]
              if check != sep:
                  raise ValueError("Expecting separator %s, got %s" % (sep, check))
              keys[0] = keys[0][1:]
  
          if len(values) != len(keys):
              msg = "line: %s\n len(keys) != len(value)\nkeys: %s\n values: %s" % (line, keys, values)
              raise ValueError(msg)
  
          kwargs.update(zip(keys, values))
  
      return kwargs
docs: Helper function to parse formatted text structured like:
  
      value1 value2 ... sep key1, key2 ...
  
      key_nums is a list giving the number of keys for each line. 0 if line should be skipped.
      sep is a string denoting the character that separates the keys from the value (None if
      no separator is present).
  
      Returns:
          dict{key1 : value1, key2 : value2, ...}
  
      Raises:
          ValueError if parsing fails.