code: def _list(self, storage_path: str) -> Generator[str, None, None]:
      logger.debug(
          f"Listing keys in bucket: '{self.bucket_name}' with storage_path: '{storage_path}'"
      )
      prefix = urllib.parse.urlparse(storage_path).path.lstrip("/")
  
      paginator = self.client.get_paginator("list_objects_v2")
      page_iterator = paginator.paginate(
          Bucket=self.bucket_name, Prefix=prefix
      )
      page_count = 0
      for page in page_iterator:
          page_count += 1
          for s3_obj in page.get("Contents", []):
              filepath, mdatetime = (
                  s3_obj["Key"],
                  s3_obj["LastModified"],
              )
              prev_mdatetime = self._file_records.get(filepath)
              if (
                  prev_mdatetime is not None
                  and prev_mdatetime >= mdatetime
              ):
                  continue
              self._file_records[filepath] = mdatetime
              yield filepath
      if page_count > 1:
          logger.info(
              f"Fetched {page_count} number of list_objects_v2 pages"
          )
  
file_path: determined/harness/determined/tensorboard/fetchers/s3.py
imports: import datetime
  import logging
  import os
  import urllib.parse
  from typing import Any, Callable, Dict, Generator, List
  from .base import Fetcher
label_desc: Use image node_id 2 for calling the S3Fetcher obj's underlying member method code with example usage: obj._list(storage_path) without return types