class_docstr: Utility to find and replace the `source_type` in Python objects.
  
  `source_type` can either be a single type or a tuple of multiple types.
  
  The caller must first call `find_nodes()`, then compute a replacement table and
  pass it to `replace_nodes`.
  
  This uses cloudpickle under the hood, so all sub-objects that are not `source_type`
  must be serializable.
  
  Args:
      source_type: the type(s) of object to find and replace. Default to DAGNodeBase.
docstr: Replace previously found DAGNodes per the given table.
docstr_tok: ["Replace","previously","found","DAGNodes","per","the","given","table","."]
code: def replace_nodes(
      self, table: Dict[SourceType, TransformedType]
  ) -> Any:
      """Replace previously found DAGNodes per the given table."""
      assert self._found is not None, "find_nodes must be called first"
      self._replace_table = table
      self._buf.seek(0)
      return pickle.load(self._buf)
  
file_path: ray/python/ray/dag/py_obj_scanner.py
imports: import io
  from typing import Any, Dict, Generic, List, Tuple, Type, TypeVar, Union
  import pickle
  import ray
  from ray.dag.base import DAGNodeBase
label_desc: Use image node_id 4 for calling the _PyObjScanner obj's underlying member method code with example usage: obj.replace_nodes(table) and returns: pickle