<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def pre_upgrade_checks(self, upgrades):
 """Run upgrade pre-checks prior to applying upgrades. Pre-checks should in general be fast to execute. Pre-checks may the use the wait_for_user function, to query the user for confirmation, but should respect the --yes-i-know option to run unattended. All pre-checks will be executed even if one fails, however if one pre- check fails, the upgrade process will be stopped and the user warned. :param upgrades: List of upgrades sorted in topological order. """

        errors = []

        for check in self.global_pre_upgrade:
            self._setup_log_prefix(plugin_id=check.__name__)
            try:
                check()
            except RuntimeError as e:
                errors.append((check.__name__, e.args))

        for u in upgrades:
            self._setup_log_prefix(plugin_id=u.name)
            try:
                u.pre_upgrade()
            except RuntimeError as e:
                errors.append((u.name, e.args))

        self._teardown_log_prefix()

        self._check_errors(errors, "Pre-upgrade check for %s failed with the"
                           " following errors:")