docs: def init_with_validation(cls, function, arguments):
      """Return a `FunctionCall` given some validation for the function and args.
  
      Args:
        function: A function name or id, to be converted into a function id enum.
        arguments: An iterable of function arguments. Arguments that are enum
            types can be passed by name. Arguments that only take one value (ie
            not a point) don't need to be wrapped in a list.
  
      Returns:
        A new `FunctionCall` instance.
  
      Raises:
        KeyError: if the enum name doesn't exist.
        ValueError: if the enum id doesn't exist.
      """
      func = FUNCTIONS[function]
      args = []
      for arg, arg_type in zip(arguments, func.args):
        if arg_type.values:  # Allow enum values by name or int.
          if isinstance(arg, six.string_types):
            try:
              args.append([arg_type.values[arg]])
            except KeyError:
              raise KeyError("Unknown argument value: %s, valid values: %s" % (
                  arg, [v.name for v in arg_type.values]))
          else:
            if isinstance(arg, (list, tuple)):
              arg = arg[0]
            try:
              args.append([arg_type.values(arg)])
            except ValueError:
              raise ValueError("Unknown argument value: %s, valid values: %s" % (
                  arg, list(arg_type.values)))
        elif isinstance(arg, int):  # Allow bare ints.
          args.append([arg])
        else:  # Allow tuples or iterators.
          args.append(list(arg))
      return cls(func.id, args)