class_docstr: Functions for :py:class:`MLReader` and :py:class:`MLWriter` shared between
  :py:class:`Pipeline` and :py:class:`PipelineModel`
  
  .. versionadded:: 2.3.0
class_docstr_tok: ["Functions","for",":","py",":","class",":","`","MLReader","`","and",":","py",":","class",":","`","MLWriter","`","shared","between",":","py",":","class",":","`","Pipeline","`","and",":","py",":","class",":","`","PipelineModel","`","..","versionadded",":",":","2.3.0"]
docstr: Check that all stages are Writable
code: def validateStages(stages: List["PipelineStage"]) -> None:
      """
      Check that all stages are Writable
      """
      for stage in stages:
          if not isinstance(stage, MLWritable):
              raise ValueError(
                  "Pipeline write will fail on this pipeline "
                  + "because stage %s of type %s is not MLWritable",
                  stage.uid,
                  type(stage),
              )
  
imports: import os
  from typing import Any, Dict, List, Optional, Tuple, Type, Union, cast, TYPE_CHECKING
  from pyspark import keyword_only, since, SparkContext
  from pyspark.ml.base import Estimator, Model, Transformer
  from pyspark.ml.param import Param, Params
  from pyspark.ml.util import MLReadable, MLWritable, JavaMLWriter, JavaMLReader, DefaultParamsReader, DefaultParamsWriter, MLWriter, MLReader, JavaMLReadable, JavaMLWritable
  from pyspark.ml.wrapper import JavaParams
  from pyspark.ml.common import inherit_doc
  from pyspark.sql.dataframe import DataFrame
label_desc: Use image node_id 2 for calling the PipelineSharedReadWrite obj's underlying member method code with example usage: obj.validateStages(stages) without return types