code: def __getattr__(self, key):
      async def _(**kwargs):
          from distributed.protocol.serialize import nested_deserialize
  
          method_name = key.replace("shuffle_", "")
          kwargs.pop("shuffle_id", None)
          kwargs.pop("run_id", None)
          # TODO: This is a bit awkward. At some point the arguments are
          # already getting wrapped with a `Serialize`. We only want to unwrap
          # here.
          kwargs = nested_deserialize(kwargs)
          meth = getattr(self.shuffle, method_name)
          return await meth(**kwargs)
  
      return _
  
file_path: distributed/distributed/shuffle/tests/utils.py
imports: from __future__ import annotations
  import itertools
  from typing import Any
  from distributed.core import PooledRPCCall
  from distributed.shuffle._core import ShuffleId, ShuffleRun
label_desc: Use image node_id 2 for calling the PooledRPCShuffle obj's underlying member method code with example usage: obj.__getattr__(key) and returns: _, unknown