Прерывание работы метода класса в Python

Рейтинг: 0Ответов: 3Опубликовано: 02.07.2023

Имеется вопрос по Python. Тема Классы, вывод десятичного счетчика, который может увеличивать или уменьшать свое значение на единицу в заданном диапазоне. В качестве примера привожу код. В нем, достигнув максимального значения диапазона, если продолжать вызывать my_count.increase() будет каждый раз выводиться 'Out of range'. Возможно ли сократить вывод строки до одного раза, несмотря на последующие вызовы метода? Заранее благодарен.

class Counter:
    current=0
    def __init__(self, start=None, end=None):
        self.start = start
        self.end = end
        
    def increase(self):
        if self.current < self.end:
            self.current += 1
            return self.current 
        else:
            return 'Out of range'

my_count=Counter(start=0, end=3)
print(my_count.increase())  # --> 1
print(my_count.increase())  # --> 2
print(my_count.increase())  # --> 3
print(my_count.increase())  # --> 'Out of range'
print(my_count.increase())  # --> 'Out of range'
print(my_count.increase())  # --> 'Out of range'

Ответы

▲ 1Принят

Как вариант вы можете вызвать ошибку IndexError и тогда программист, который работает с вашим классом будет вынужден отреагировать на выход за пределы листа.

def increase(self):
    if self.current < self.end:
        self.current += 1
        return self.current
    else:
        raise IndexError('list index out of range')

Результат:

1
2
3
Traceback (most recent call last):
  File "/home/****/Documents/Develop/Local/PycharmProjects/pythonProject12/main.py", line 20, in <module>
    print(my_count.increase())  # --> 'Out of range'
          ^^^^^^^^^^^^^^^^^^^
  File "/home/****/Documents/Develop/Local/PycharmProjects/pythonProject12/main.py", line 13, in increase
    raise IndexError('list index out of range')
IndexError: list index out of range
▲ 0

Прерывание выполнения метода достигается использованием оператора return либо вызовом исключения raise. Как вариант - можно добавить дополнительное свойство в класс out_of_range = False, когда отрабатывает блок else значение свойства меняете на True, затем проверяете значения свойсва out_of_range если оно False выводите 'Out of range' если True то просто return либо просто ничего pass:

class Counter:
    out_of_range = False
    current=0
    def __init__(self, start=None, end=None):
        self.start = start
        self.end = end
        
    def increase(self):
        if self.current < self.end:
            self.current += 1
            return self.current 
        else:
            if(self.out_of_range):
                pass
            else:
                self.out_of_range = True
                return 'Out of range'

my_count=Counter(start=0, end=3)

Прошу заметить, что у вас в любом случае выполняется метод print, поэтому даже если ваш метод не возвращает ничего в консоль будет выводится None, можно еще вернуть '', но это все равно не полное ничего :) Либо вам нужен свой метод print который вообще не будет задействовать консоль при аргументе равном None.

Поэтому вам лучше принимать решение что и когда выводить в консоль в самом методе. В идеале - вызывать исключение, затем обрабатывать его и уже потом принимать решение о том какое сообщение выводить в консоль.

▲ 0

Я что-то добавил в ваш код:

class Counter:
    current = 0
    def __init__(self, start=None, end=None):
        self.start = start
        self.end = end
        self.out_of_range = False                            # см. 1
        
    def increase(self):
        if self.end is None or self.current < self.end:      # см. 2
            self.current += 1
            return self.current 
        elif not self.out_of_range:                          # см. 3
            self.out_of_range = True                         # см. 4
            return 'Out of range'
        else:
            return ''                                        # см. 5
                                                 

Объяснения:

  1. Я добавил переменную объекта out_of_range, которая сначала будет иметь значение False.

  2. В вашем коде отсутствует обработка для end=None. Здесь она добавлена.

  3. Когда пока не было достигнуто максимального значения диапазона (т.е. это первый случай),

  4. отметим, что только что оно достигнуто выло.

  5. Иначе вернем пустую строку, чтобы функция print() уже ничего не печатала.


Примечание:

Для создания объекта не надо ключей. Вместо

my_count = Counter(start=0, end=3)

вы можете написать

my_count = Counter(0, 3)