class_docstr: An operand for shuffle execution which partitions data by the value in each record’s partition key, and
  send the partitioned data from all mappers to all reducers.
class_docstr_tok: ["An","operand","for","shuffle","execution","which","partitions","data","by","the","value","in","each","record","\u2019","s","partition","key",",","and","send","the","partitioned","data","from","all","mappers","to","all","reducers","."]
code: def get_dependent_data_keys(self):
      from .fetch import FetchShuffle
  
      if self.stage == OperandStage.reduce:
          inputs = self.inputs or ()
          deps = []
          for inp in inputs:
              if isinstance(inp.op, ShuffleProxy):
                  deps.extend(
                      [
                          (chunk.key, self.reducer_index)
                          for chunk in inp.inputs or ()
                      ]
                  )
              elif isinstance(inp.op, FetchShuffle):
                  # fetch shuffle by index doesn't store data keys, so it won't run into this function.
                  assert (
                      inp.op.shuffle_fetch_type
                      == ShuffleFetchType.FETCH_BY_KEY
                  )
                  deps.extend(
                      [
                          (k, self.reducer_index)
                          for k in inp.op.source_keys
                      ]
                  )
              else:
                  deps.append(inp.key)
          return deps
      return super().get_dependent_data_keys()
  
file_path: mars/mars/core/operand/shuffle.py
imports: from .None import ShuffleFetchType, FetchShuffle
  from ...None import opcodes
  from ...serialization.serializables import Int32Field, StringField, TupleField, FieldTypes
  from .base import Operand, VirtualOperand, OperandStage
label_desc: Use image node_id 3 for calling the MapReduceOperand obj's underlying member method code with example usage: obj.get_dependent_data_keys() and returns: super, deps