code: def _pull_table(
      self,
      name: str,
      tag: str,
      parties: typing.List[PartyMeta],
      table_metas: List[TableMeta],
  ) -> typing.List:
      rtn = []
      for table_meta, party in zip(table_metas, parties):
          party = Party(role=party[0], party_id=party[1])
          party_topic_infos = (
              self._get_party_topic_infos_by_name_and_partitions(
                  [party], name, partitions=table_meta.num_partitions
              )[0]
          )
          topic_infos = party_topic_infos
          receive_func = self._get_partition_receive_func(
              name=name,
              tag=tag,
              src_party_id=self.local_party[1],
              src_role=self.local_party[0],
              dst_party_id=party.party_id,
              dst_role=party.role,
              topic_infos=topic_infos,
              mq=self._mq,
              conf=self._conf,
          )
          table = self.computing_session.parallelize(
              range(table_meta.num_partitions),
              include_key=False,
              partition=table_meta.num_partitions,
          )
          table = table.mapPartitionsWithIndexNoSerdes(
              receive_func,
              output_key_serdes_type=table_meta.key_serdes_type,
              output_value_serdes_type=table_meta.value_serdes_type,
              output_partitioner_type=table_meta.partitioner_type,
          )
          rtn.append(table)
      return rtn
  
imports: import json
  import logging
  import sys
  import typing
  from typing import List
  from fate.arch.computing.api import KVTableContext
  from fate.arch.federation.api import Federation, PartyMeta, TableMeta
  from ._datastream import Datastream
  from ._parties import Party
label_desc: Use image node_id 10 for calling the MessageQueueBasedFederation obj's underlying member method code with example usage: obj._pull_table(name, tag, parties, table_metas) and returns: rtn