code: def __init__(
      self,
      ctx: "Context",
      component: "Component",
      role: Role,
      stage: Stage,
      config,
  ):
      self.cpn = component
      self.parameter_artifacts_desc = {}
      self.parameter_artifacts_apply = {}
      self.input_data: Dict[
          str, ComponentExecutionIO.InputPair[Metadata]
      ] = {}
      self.input_model: Dict[
          str, ComponentExecutionIO.InputPair[Metadata]
      ] = {}
      self.output_data: Dict[
          str, ComponentExecutionIO.OutputPair[DataOutputMetadata]
      ] = {}
      self.output_model: Dict[
          str, ComponentExecutionIO.OutputPair[ModelOutputMetadata]
      ] = {}
      self.output_metric: Dict[
          str, ComponentExecutionIO.OutputPair[MetricOutputMetadata]
      ] = {}
  
      logging.debug(f"parse and apply component artifacts")
  
      for arg in component.func_args[2:]:
          if not (
              self._handle_parameter(component, arg, config)
              or self._handle_input(
                  ctx, component, arg, stage, role, config
              )
              or self._handle_output(
                  ctx, component, arg, stage, role, config
              )
          ):
              raise ValueError(f"args `{arg}` not provided")
  
      self._handle_output(ctx, component, "metric", stage, role, config)
  
imports: import logging
  import typing
  from typing import Dict, Generic, List, Optional, Union
  from fate.components.core.essential import Role, Stage
  from .artifacts._base_type import AT, MM, ArtifactDescribe, M, _ArtifactsType, _ArtifactType
label_desc: Use image node_id 1 to create a new ComponentExecutionIO object  with example: obj = ComponentExecutionIO(ctx, component, role, stage, config)