code: def append_preprocessor(self, preprocessors):
      if type(preprocessors) is not list:
          preprocessors = [preprocessors]
  
      for preprocessor in preprocessors:
          preprocessor.order_index = len(self.preprocessors)
          self.preprocessors.append(preprocessor)
          preprocessor.initialize(self)
  
          # This is so bad. TODO: Either put this away in a function, or figure out a more concicse way to do it.
          for data_group_label in preprocessor.data_groups:
              if preprocessor.output_shape is not None:
                  self.data_groups[
                      data_group_label
                  ].output_shape = preprocessor.output_shape[
                      data_group_label
                  ]
  
      return
  
imports: import os
  import csv
  import numpy
  import tables
  import copy
  from tqdm import tqdm
  from deepneuro.augmentation.augment import Copy
  from deepneuro.utilities.conversion import read_image_files
  from deepneuro.data.data_group import DataGroup
  from deepneuro.data.data_load import parse_directories, parse_filepaths, parse_hdf5, parse_csv, parse_numpy
  from deepneuro.utilities.util import add_parameter
label_desc: Use image node_id 7 for calling the DataCollection obj's underlying member method code with example usage: obj.append_preprocessor(preprocessors) without return types