code: def _readexactly(self, n: int) -> bytes:
      assert n >= 0
      data: List[bytes] = []
      while n > 0:
          block = self._f.read(n)
          if len(block) == 0:
              raise UnexpectedEOFError()
          data.append(block)
          n -= len(block)
      return b"".join(data)
  
imports: from typing import BinaryIO, List, Optional, Tuple, Type
  from types import TracebackType
  import abc
  import io
  import os
  import sys
  from concurrent.futures import ThreadPoolExecutor
  import janus
  from hailtop.utils import blocking_to_async
  from .exceptions import UnexpectedEOFError
label_desc: Use image node_id 4 for calling the _ReadableStreamFromBlocking obj's underlying member method code with example usage: obj._readexactly(n) and returns: bytes