class_docstr: Base class for a node in TFX pipeline.
class_docstr_tok: ["Base","class","for","a","node","in","TFX","pipeline","."]
docstr: Experimental: Add components that must run before this one.
  
  This method enables task-based dependencies by enforcing execution order for
  synchronous pipelines on supported platforms. Currently, the supported
  platforms are Airflow, Beam, and Kubeflow Pipelines.
  
  Note that this API call should be considered experimental, and may not work
  with asynchronous pipelines, sub-pipelines and pipelines with conditional
  nodes. We also recommend relying on data for capturing dependencies where
  possible to ensure data lineage is fully captured within MLMD.
  
  
  Args:
    upstream_nodes: a list of components that must run before this node.
docstr_tok: ["Experimental",":","Add","components","that","must","run","before","this","one",".","This","method","enables","task-based","dependencies","by","enforcing","execution","order","for","synchronous","pipelines","on","supported","platforms",".","Currently",",","the","supported","platforms","are","Airflow",",","Beam",",","and","Kubeflow","Pipelines",".","Note","that","this","API","call","should","be","considered","experimental",",","and","may","not","work","with","asynchronous","pipelines",",","sub-pipelines","and","pipelines","with","conditional","nodes",".","We","also","recommend","relying","on","data","for","capturing","dependencies","where","possible","to","ensure","data","lineage","is","fully","captured","within","MLMD",".","Args",":","upstream_nodes",":","a","list","of","components","that","must","run","before","this","node","."]
code: def add_upstream_nodes(self, upstream_nodes):
      """Experimental: Add components that must run before this one.
  
      This method enables task-based dependencies by enforcing execution order for
      synchronous pipelines on supported platforms. Currently, the supported
      platforms are Airflow, Beam, and Kubeflow Pipelines.
  
      Note that this API call should be considered experimental, and may not work
      with asynchronous pipelines, sub-pipelines and pipelines with conditional
      nodes. We also recommend relying on data for capturing dependencies where
      possible to ensure data lineage is fully captured within MLMD.
  
  
      Args:
        upstream_nodes: a list of components that must run before this node.
      """
      self._upstream_nodes.update(upstream_nodes)
      for upstream_node in upstream_nodes:
          if self not in upstream_node.downstream_nodes:
              upstream_node.add_downstream_node(self)
  
imports: import abc
  import copy
  from typing import Any, Dict, Optional, Type
  from tfx.dsl.components.base import base_driver
  from tfx.dsl.components.base import base_executor
  from tfx.dsl.components.base import executor_spec
  from tfx.dsl.context_managers import dsl_context_registry
  from tfx.dsl.experimental.node_execution_options import utils
  from tfx.utils import deprecation_utils
  from tfx.utils import doc_controls
  from tfx.utils import json_utils
  from tfx.utils import name_utils
label_desc: Use image node_id 19 for calling the BaseNode obj's underlying member method code with example usage: obj.add_upstream_nodes(upstream_nodes) without return types