code: def gen_params(raw_params):
      u
      assert raw_params[0].type == token.STAR and len(raw_params) > 2
      curr_idx = 2 # the first place a keyword-only parameter name can be is index 2
      max_idx = len(raw_params)
      while curr_idx < max_idx:
          curr_item = raw_params[curr_idx]
          prev_item = curr_item.prev_sibling
          if curr_item.type != token.NAME:
              curr_idx += 1
              continue
          if prev_item is not None and prev_item.type == token.DOUBLESTAR:
              break
          name = curr_item.value
          nxt = curr_item.next_sibling
          if nxt is not None and nxt.type == token.EQUAL:
              default_value = nxt.next_sibling
              curr_idx += 2
          else:
              default_value = None
          yield (name, default_value)
          curr_idx += 1
docs: u"""
      Generator that yields tuples of (name, default_value) for each parameter in the list
      If no default is given, then it is default_value is None (not Leaf(token.NAME, 'None'))