docs: def get_unit_spike_features(self, unit_id, feature_name, start_frame=None, end_frame=None):
          '''This function extracts the specified spike features from the specified unit.
          It will return spike features from within three ranges:
  
              [start_frame, t_start+1, ..., end_frame-1]
              [start_frame, start_frame+1, ..., final_unit_spike_frame - 1]
              [0, 1, ..., end_frame-1]
              [0, 1, ..., final_unit_spike_frame - 1]
  
          if both start_frame and end_frame are given, if only start_frame is
          given, if only end_frame is given, or if neither start_frame or end_frame
          are given, respectively. Spike features are returned in the form of an
          array_like of spike features. In this implementation, start_frame is inclusive
          and end_frame is exclusive conforming to numpy standards.
  
          Parameters
          ----------
          unit_id: int
              The id that specifies a unit in the recording.
          feature_name: string
              The name of the feature to be returned.
          start_frame: int
              The frame above which a spike frame is returned  (inclusive).
          end_frame: int
              The frame below which a spike frame is returned  (exclusive).
          Returns
          ----------
          spike_features: numpy.ndarray
              An array containing all the features for each spike in the
              specified unit given the range of start and end frames.
          '''
          if isinstance(unit_id, (int, np.integer)):
              if unit_id in self.get_unit_ids():
                  if unit_id not in self._unit_features.keys():
                      self._unit_features[unit_id] = {}
                  if isinstance(feature_name, str):
                      if feature_name in self._unit_features[unit_id].keys():
                          if start_frame is None:
                              start_frame = 0
                          if end_frame is None:
                              end_frame = len(self.get_unit_spike_train(unit_id))
                          return self._unit_features[unit_id][feature_name][start_frame:end_frame]
                      else:
                          raise ValueError(str(feature_name) + " has not been added to unit " + str(unit_id))
                  else:
                      raise ValueError(str(feature_name) + " must be a string")
              else:
                  raise ValueError(str(unit_id) + " is not a valid unit_id")
          else:
              raise ValueError(str(unit_id) + " must be an int")