code: def _check_align_needed(
      cls, op: "DataFrameAlign", left_chunks: list, right_chunks: list
  ):
      lhs, rhs = op.lhs, op.rhs
      if all(
          lc.key == rc.key for lc, rc in zip(lhs.chunks, left_chunks)
      ) and all(
          lc.key == rc.key for lc, rc in zip(rhs.chunks, right_chunks)
      ):
          raise _NoNeedToAlign
  
imports: from typing import Any, Optional, Union
  import numpy
  from ...None import opcodes
  from ...core import get_output_types, recursive_tile, OutputType
  from ...serialization.serializables import AnyField, KeyField, StringField, Int16Field, Int64Field
  from ...typing import TileableType
  from ..operands import DataFrameOperand, DataFrameOperandMixin
  from ..align import align_dataframe_dataframe, align_dataframe_series, align_series_series
  from ..core import IndexValue
  from ..utils import validate_axis, parse_index, build_empty_df
label_desc: Use image node_id 10 for calling the DataFrameAlign obj's underlying member method code with example usage: obj._check_align_needed(cls, op, left_chunks, right_chunks) without return types