class_docstr: Utility class for quick manipulation of a connector pipeline.
code: def _fix_input_output_types(self):
      if len(self.connectors) > 0:
          self.input_type = self.connectors[0].input_type
          self.output_type = self.connectors[-1].output_type
          # TODO (sven): Create some examples for pipelines, in which the spaces
          #  are changed several times by the individual pieces.
          self.input_observation_space = self.connectors[
              0
          ].input_observation_space
          self.input_action_space = self.connectors[
              0
          ].input_action_space
          self._observation_space = self.connectors[
              -1
          ].observation_space
          self._action_space = self.connectors[-1].action_space
      else:
          self.input_type = None
          self.output_type = None
          self._observation_space = None
          self._action_space = None
  
imports: from collections import defaultdict
  import logging
  from typing import Any, Dict, List, Optional, Type, Union
  from ray.rllib.connectors.connector_v2 import ConnectorV2
  from ray.rllib.core.rl_module.rl_module import RLModule
  from ray.rllib.utils.annotations import override
  from ray.rllib.utils.typing import EpisodeType
  from ray.util.annotations import PublicAPI
  from ray.util.timer import _Timer
label_desc: Use image node_id 12 for calling the ConnectorPipelineV2 obj's underlying member method code with example usage: obj._fix_input_output_types() without return types