Задача курса
Python: Класс Event с альтернативным конструктором и валидацией
Курс «Python для продвинутых: ООП, типизация и тестирование» · урок «classmethod, staticmethod и выбор между ними и обычным методом»
Условие
Класс Event с альтернативным конструктором и валидацией
Что уже дано
Проверяющая система вызывает функцию parse_event, которую вы определяете в редакторе. Никаких заранее созданных глобальных объектов нет — только вызовы функции с разными аргументами.
В редакторе дан незавершённый каркас класса Event и сигнатура функции parse_event.
Что нужно сделать
Допишите класс Event и функцию parse_event:
Класс Event:
__init__(self, title: str, year: int, month: int, day: int)— сохраняет четыре атрибута экземпляра:title,year,month,day.- Классметод
from_string(cls, s: str) -> "Event"— альтернативный конструктор. Принимает строку формата"название|ГГГГ-ММ-ДД", разбирает её и возвращает новый экземпляр черезcls(...). Разделитель между названием и датой — вертикальная черта|. Дату разбирайте по дефису. - Статический метод
is_valid_month(month: int) -> bool— возвращаетTrue, еслиmonthнаходится в диапазоне от 1 до 12 включительно, иначеFalse. Метод не обращается ни кself, ни кcls. - Обычный метод
label(self) -> str— возвращает строку вида"название (ГГГГ)", например"Юбилей (2025)".
Функция parse_event:
parse_event(raw: str) -> dict — принимает строку того же формата "название|ГГГГ-ММ-ДД", создаёт объект Event через Event.from_string(raw), а затем возвращает словарь:
{
"title": <строка>,
"year": <int>,
"month": <int>,
"day": <int>,
"label": <строка вида "название (ГГГГ)">,
"month_valid": <bool>
}
Значение "month_valid" получите через Event.is_valid_month(event.month).
Ввод и вывод
stdin не используется. Печатать через print в stdout ничего не нужно.
Проверяющая система вызывает parse_event(raw), где raw — строка формата "название|ГГГГ-ММ-ДД". Функция должна вернуть словарь с ключами title, year, month, day, label, month_valid.
Пример использования
print(repr(parse_event('Юбилей|2025-01-07')))
Результат:
{'title': 'Юбилей', 'year': 2025, 'month': 1, 'day': 7, 'label': 'Юбилей (2025)', 'month_valid': True}
