Как создать родительский класс для 2 типов ошибок и затем вернуть количество друзей без маски в данной задаче?

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

Задача такая:

  1. Реализуйте класс Cafe, экземпляры которого имеют одно имя атрибута. Напишите метод visit_cafe с одним параметром, посетитель типа dict. Из-за пандемии не все могут посетить кафе. Если у посетителя нет прививочного ключа, значит, он не привит. В этом случае метод должен вызвать исключение NotVaccinatedError.

  2. Проверяйте дату вакцины, если просрочена, возбудите исключение OutdatedVaccineError.

  3. Проверьте в маске ли посетитель, если нет, возбудите исключение NotWearingMaskError

  4. Проверьте сразу список посетителей функцией go_to_cafe, если вакцины нет или прострочена, выполните инструкцию return f"All friends should be vaccinated"

Используйте следующую структуру проекта: errors.py, cafe.py, main.py

Два вопроса:

  1. Как создать родительский класс VaccineError для ошибок NotVaccinatedError и OutdatedVaccineError?

  2. Если все привиты, но кто-то не носит маски, как вернуть сообщение «Друзья должны купить {masks_to_buy} масок», где masks_to_buy — это количество друзей, у которых нет маски.

Мое решение ниже.

Модуль errors:

class VaccineError(Exception):
pass
class NotVaccinatedError(VaccineError):
pass
class OutdatedVaccineError(VaccineError):
pass
class NotWearingMaskError(Exception):
pass

Модуль cafe

import datetime
    from errors import NotVaccinatedError, OutdatedVaccineError, NotWearingMaskError


class Cafe:
def __init__(self, name):
    self.name = name



def visit_cafe(self, visitor):
    self.visitor = visitor
    if "vaccine" not in self.visitor:
        raise NotVaccinatedError
    elif visitor["vaccine"]["expiration_date"] < datetime.date.today():
        raise OutdatedVaccineError
    elif not visitor["wearing_a_mask"]:
        raise NotWearingMaskError
    else:
        return f"Welcome to {self.name}"

Модуль main

def go_to_cafe(friends, cafe):
masks_to_buy = 0
for i, person in enumerate(friends, 1):
    print(masks_to_buy)
    try:
        if cafe.visit_cafe(person):
            if i == len(friends):
                print(f"Friends can go to {cafe.name}")
                return f"Friends can go to {cafe.name}"

    except (VaccineError):
        print(f"All friends should be vaccinated")
        return f"All friends should be vaccinated"

    except (NotWearingMaskError):
        masks_to_buy += 1

print(f"Friends should buy {masks_to_buy} masks")
return f"Friends should buy {masks_to_buy} masks"

Приимеры использования:

kfc = Cafe("KFC")
visitor = {
"name": "Paul",
"age": 23,
"vaccine": {
    "expiration_date": datetime.date.today()
},
"wearing_a_mask": True
}

kfc.visit_cafe(visitor) # "Welcome to KFC"





friends = [
{
    "name": "name1",
    "vaccine": {
        "expiration_date": datetime.date.today()
    },
    "wearing_a_mask": True
},
{
    "name": "name2",
    "vaccine": {
        "expiration_date": datetime.date.today()
    },
    "wearing_a_mask": True
},
]

go_to_cafe(friends, Cafe("KFC")) # "Friends can go to KFC"





friends = [
{
    "name": "name1",
    "wearing_a_mask": True
},
{
    "name": "name2",
    "vaccine": {
        "expiration_date": datetime.date.today()
    },
    "wearing_a_mask": True
},
]

go_to_cafe(friends, Cafe("KFC")) # "All friends should be vaccinated"




friends = [
{
    "name": "Alisa",
    "vaccine": {
        "expiration_date": datetime.date.today()
    },
    "wearing_a_mask": 0
},
{
    "name": "Bob",
    "vaccine": {
        "expiration_date": datetime.date.today()
    },
    "wearing_a_mask": 1
},
]

go_to_cafe(friends, Cafe("KFC")) # "Friends should buy 2 masks"

Ответы

▲ 0

Если тебе нужен общий класс для NotVaccinatedError и OutdatedVaccineError, просто создай новый класс исключения, а эти два наследуй от него

class CommonVacinateError(Exception):
    pass

class NotVaccinatedError(CommonVacinateError):
    pass

class OutdatedVaccineError(CommonVacinateError):
    pass

Затем в цикле обрабатывай исключение NotWearingMaskError и подсчитывай сколько раз оно сработало. Затем после цикла, если этот счетчик равен 0 - пишешь, что друзья могут идти в кафе, иначе возвращаешь сообщение, нужно купить n масок

def go_to_cafe(friends, cafe):
    masks_to_buy = 0
    result = ""
    try:
        for i, person in enumerate(friends, 1):
            try:
                cafe.visit_cafe(person)
            except (NotWearingMaskError):
                masks_to_buy += 1

        if masks_to_buy:
            result =f"Friends should buy {masks_to_buy} masks"
        else:
            result = f"You may visit"
    except (VaccineError):
            result = f"All friends should be vaccinated"
    
    print(result)
    return result