class_docstr: Launcher is the main entrance of nodes in TFleX.
  
  It handles TFX internal details like artifact resolving, execution
  triggering and result publishing.
class_docstr_tok: ["Launcher","is","the","main","entrance","of","nodes","in","TFleX",".","It","handles","TFX","internal","details","like","artifact","resolving",",","execution","triggering","and","result","publishing","."]
docstr: Updates output_dict with driver output.
code: def _update_with_driver_output(
      self,
      driver_output: driver_output_pb2.DriverOutput,
      exec_properties: Dict[str, Any],
      output_dict: typing_utils.ArtifactMutableMultiMap,
  ):
      """Updates output_dict with driver output."""
      for key, artifact_list in driver_output.output_artifacts.items():
          python_artifact_list = []
          assert output_dict[
              key
          ], "Output artifacts should not be empty."
          artifact_cls = output_dict[key][0].type
          assert all(
              artifact_cls == a.type for a in output_dict[key][1:]
          ), "All artifacts should have a same type."
  
          for proto_artifact in artifact_list.artifacts:
              # Create specific artifact class instance for easier class
              # identification and property access.
              python_artifact = artifact_cls()
              python_artifact.set_mlmd_artifact(proto_artifact)
              python_artifact_list.append(python_artifact)
          output_dict[key] = python_artifact_list
  
      for key, value in driver_output.exec_properties.items():
          exec_properties[key] = getattr(
              value, value.WhichOneof("value")
          )
  
imports: import sys
  from typing import Any, Dict, List, Mapping, Optional, Type, TypeVar
  from absl import logging
  import attr
  import grpc
  import portpicker
  from tfx import types
  from tfx.dsl.compiler import placeholder_utils
  from tfx.dsl.io import fileio
  from tfx.orchestration import data_types_utils
  from tfx.orchestration import metadata
  from tfx.orchestration.portable import base_driver_operator
  from tfx.orchestration.portable import base_executor_operator
  from tfx.orchestration.portable import beam_executor_operator
  from tfx.orchestration.portable import cache_utils
  from tfx.orchestration.portable import data_types
  from tfx.orchestration.portable import docker_executor_operator
  from tfx.orchestration.portable import execution_publish_utils
  from tfx.orchestration.portable import execution_watcher
  from tfx.orchestration.portable import importer_node_handler
  from tfx.orchestration.portable import inputs_utils
  from tfx.orchestration.portable import outputs_utils
  from tfx.orchestration.portable import python_driver_operator
  from tfx.orchestration.portable import python_executor_operator
  from tfx.orchestration.portable import resolver_node_handler
  from tfx.orchestration.portable.input_resolution import exceptions
  from tfx.orchestration.portable.mlmd import context_lib
  from tfx.orchestration.portable.mlmd import execution_lib
  from tfx.proto.orchestration import driver_output_pb2
  from tfx.proto.orchestration import executable_spec_pb2
  from tfx.proto.orchestration import execution_result_pb2
  from tfx.proto.orchestration import pipeline_pb2
  from tfx.utils import typing_utils
  from google.protobuf import message
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 11 for calling the Launcher obj's underlying member method code with example usage: obj._update_with_driver_output(driver_output, exec_properties, output_dict) without return types