code: def get_fields(
      sample,
      field_names,
      allowed_types=None,
      same_type=False,
      allow_none=True,
  ):
      """Gets the given sample fields and optionally validates their types and
      values.
  
      Args:
          sample: a :class:`fiftyone.core.sample.Sample`
          field_names: an iterable of field names to get
          allowed_types (None): an optional iterable of
              :class:`fiftyone.core.labels.Label` types to enforce that the
              field values have
          same_type (False): whether to enforce that all fields have same type
          allow_none (True): whether to allow the fields to be None
  
      Returns:
          a tuple of field values
  
      Raises:
          ValueError if a field does not exist or does not meet the specified
          criteria
      """
      label_types = {}
      values = []
      for field_name in field_names:
          value = get_field(
              sample,
              field_name,
              allowed_types=allowed_types,
              allow_none=allow_none,
          )
  
          if same_type:
              label_types[field_name] = type(value)
              values.append(value)
  
      if same_type and len(set(label_types.values())) > 1:
          raise ValueError(
              "Sample '%s' fields %s must have the same type; found %s"
              % (sample.id, field_names, label_types)
          )
  
      return tuple(values)
  
file_path: fiftyone/fiftyone/core/validation.py
imports: import eta.core.utils
  import fiftyone.core.media
  import fiftyone.core.utils
label_desc: Use image node_id 10 for calling a global function with example usage: get_fields(sample, field_names, allowed_types, same_type, allow_none) and returns: tuple