code: def read_field_descriptors(self):
      offset = HeaderType.itemsize
      field_descriptors = np.fromfile(
          self._fname,
          dtype=FieldDescType,
          count=self.num_fields,
          offset=offset,
      )
      field_descriptors.setflags(write=False)
      handlers = get_handlers(field_descriptors)
  
      self.field_descriptors = field_descriptors
      self.field_names = list(
          map(
              decode_null_terminated_string,
              self.field_descriptors["name"],
          )
      )
      self.handlers = dict(zip(self.field_names, handlers))
  
      for field_name, field_desc in zip(
          self.field_names, self.field_descriptors
      ):
          if field_name in self._custom_handlers:
              CustomHandler = self._custom_handlers[field_name]
              self.handlers[field_name] = CustomHandler.from_binary(
                  field_desc["arguments"]
              )
  
      for field_name, handler in self.handlers.items():
          if handler is None:
              raise ValueError(
                  f"Must specify a custom_field entry "
                  f"for custom field {field_name}"
              )
  
      self.metadata_type = get_metadata_type(
          list(self.handlers.values())
      )
  
file_path: ffcv/ffcv/reader.py
imports: import numpy
  from .utils import decode_null_terminated_string
  from .types import ALLOC_TABLE_TYPE, HeaderType, CURRENT_VERSION, FieldDescType, get_handlers, get_metadata_type
label_desc: Use image node_id 4 for calling the Reader obj's underlying member method code with example usage: obj.read_field_descriptors() without return types