Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛР-5 / lab5

.py
Скачиваний:
0
Добавлен:
27.05.2026
Размер:
3.72 Кб
Скачать
class PhoneNumberError(Exception): #исключение, сигнализирующее о некорректном номере телефона
    pass
class PhoneInputValidator:
    def __init__(self):
        self.max_attempts = 3
        self.attempt = 1
        #"состояние" для коррекции – можно менять подсказки или сбрасывать данные
        self.help_level = 0   # чем выше, тем подробнее подсказка
    def prepare_input(self): #подготовительные работы запрос ввода
        print("\nввод номера телефона")
        if self.help_level == 0:
            prompt = "введите номер телефона (11 цифр): "
        elif self.help_level == 1:
            prompt = "пожалуйста, введите ровно 11 цифр без пробелов и скобок: "
        else:
            prompt = "важно! только цифры, 11 штук, пример 79123456789: "
        return input(prompt)
    def validate(self, phone: str) -> bool: #проверка корректности номера (контракт) возвращает True, если номер валиден
        if not phone.isdigit():
            return False
        if len(phone) != 11:
            return False
        return True
    def finish_success(self, phone: str): #завершающие работы при успешной проверке
        print(f"номер {phone} успешно принят. Спасибо!")
    def correct_state(self): #коррекция состояния (увеличиваем уровень помощи, сбрасываем попытки неявно)
        self.help_level += 1
        print(f"коррекция: включён уровень подсказок {self.help_level}")
    def input_phone_with_retry(self):
        #схема Мейера: повторяем попытки, пока Success != True
        #при ошибке корректируем состояние и повторяем
        success = False
        while not success:
            try:
                #подготовительные работы
                phone = self.prepare_input()
                #проверка контракта (валидация)
                if not self.validate(phone):
                    raise PhoneNumberError("некорректный номер")
                #если всё хорошо - завершаем работу
                self.finish_success(phone)
                success = True  #выход из цикла
            except PhoneNumberError:
                if self.attempt >= self.max_attempts:
                    #исчерпаны все попытки – выбрасываем исключение выше
                    raise PhoneNumberError(f"после {self.max_attempts} попыток номер не был принят.")
                #коррекция состояния
                self.correct_state()
                self.attempt += 1
                # success остаётся False, цикл продолжится
    def run(self): #запуск с внешней обработкой финального исключения
        try:
            self.input_phone_with_retry()
        except PhoneNumberError as e:
            print(f"\nОШИБКА: {e}")
            print("программа завершена из-за невозможности выполнить контракт.")
validator = PhoneInputValidator()
validator.run()
Соседние файлы в папке ЛР-5