code: def file_handles(self) -> Iterable[IO[str]]:
          
          if self.file_handle:
              yield self.file_handle
              self.file_handle.close()
              self.file_handle = None
          else:
              for name in self.file_names():
                  with open(name, "r") as f:
                      yield f
docs: Generates all file handles represented by the analysis.
          Callee owns file handle and closes it when the next is yielded or the
          generator ends.