code: def get_outputfiles(self, job: Job):
      if job.rule.output[0].is_multiext:
          prefix_len = len(
              apply_wildcards(
                  job.rule.output[0].multiext_prefix, job.wildcards
              )
          )
          yield from ((f, f[prefix_len:]) for f in job.output)
      else:
          assert (
              len(job.output) == 1
          ), "bug: multiple output files in cacheable job but multiext not used for declaring them"
          yield (job.output[0], "")
  
file_path: snakemake/snakemake/caching/__init__.py
imports: from abc import ABCMeta, abstractmethod
  import os
  from snakemake.jobs import Job
  from snakemake.io import apply_wildcards
  from snakemake.exceptions import WorkflowError, CacheMissException
  from snakemake.caching.hash import ProvenanceHashMap
label_desc: Use image node_id 2 for calling the AbstractOutputFileCache obj's underlying member method code with example usage: obj.get_outputfiles(job) without return types