<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def run(self, tests: Iterable[TestCase], *, instrument: bool = True ) -> TestSuiteCoverage: """ Computes line coverage information for a given set of tests. Parameters: tests: the tests for which coverage should be computed. instrument: if set to True, calls prepare and cleanup before and after running the tests. If set to False, prepare and cleanup are not called, and the responsibility of calling those methods is left to the user. """

        container = self.container
        logger.debug("computing coverage for container: %s", container.uid)

        try:
            if instrument:
                logger.debug("instrumenting container")
                self.prepare()
            else:
                logger.debug("not instrumenting container")
        except Exception:
            msg = "failed to instrument container."
            raise exceptions.FailedToComputeCoverage(msg)

        cov = {}
        for test in tests:
            logger.debug("Generating coverage for test %s in container %s",
                         test.name, container.uid)
            outcome = self.__installation.containers.execute(container, test)
            filelines = self.extract()
            test_coverage = TestCoverage(test.name, outcome, filelines)
            logger.debug("Generated coverage for test %s in container %s",
                         test.name, container.uid)
            cov[test.name] = test_coverage

        self.cleanup()

        coverage = TestSuiteCoverage(cov)
        logger.debug("Computed coverage for container: %s", container.uid)
        return coverage