docs: def ParseArgs(self, args):
      """Parse and validate the args.
  
      Note we pop all the args we consume here - so if there are any args we dont
      know about, args will not be an empty dict after this. This allows the same
      args to be parsed by several TypeDescriptorSets.
  
      Args:
        args: A dictionary of arguments that this TypeDescriptorSet might use. If
          this dict does not have a required parameter, we still yield its default
          value.
  
      Yields:
        A (name, value) tuple of the parsed args.
      """
      for descriptor in self:
        # Get the value from the kwargs or, if not specified, the default.
        value = args.pop(descriptor.name, None)
  
        if value is None:
          # No need to validate the default value.
          value = descriptor.default
        else:
          try:
            # Validate this value - this should raise if the value provided is not
            # acceptable to the type descriptor.
            value = descriptor.Validate(value)
          except Exception:
            logging.error("Invalid value %s for arg %s", value, descriptor.name)
            raise
  
        yield descriptor.name, value