G. Валидация имени

При регистрации в различных сервисах пользователи вводят большое количество информации. Правильное заполнение полей — важная часть работы программы, поэтому формы снабжают системами валидации данных.

Напишите функцию name_validation, которая принимает один позиционный аргумент — фамилию или имя.

Если параметр не является строкой, то вызовите исключение TypeError.

А также разработайте собственные ошибки:

  • CyrillicError — вызывается, если значение не состоит только из кириллических букв;
  • CapitalError — вызывается, если значение не начинается с заглавной буквы или найдена заглавная буква не в начале значения.

Обработка ошибок должна происходить в порядке, указанном в задании.

В случае успешного выполнения, функция должна вернуть переданный параметр без изменений.

Примечание

В решении не должно быть вызовов требуемых функций.

Пример

Ввод

print(name_validation("user"))

Вывод

Вызвано исключение CyrillicError

Ввод

print(name_validation("иванов"))

Вывод

Вызвано исключение CapitalError

Решение

Довольно простая задача.

Проверяем является ли переданный параметр строкой с помощью type() или isinstance(). Если это не так, вызываем исключение TypeError.
Проверяем все ли буквы являются кириллицей. Это можно сделать несколькими способами: с помощью диапазонов кодов русских букв или с помощью заранее заданного алфавита. Можно проверить буквы с помощью all() или any(), а можно посчитать количество букв не являющихся кириллицей. Если хоть одна буква не является кириллицей вызываем исключение CyrillicError.
Проверяем является ли первая буква заглавной, а остальные прописными. Самый простой способ – преобразовать строку с помощью метода .istitle(). Если они не равны, то вызвать исключение CapitalError.

Посмотреть код

Решение

Python
class CyrillicError(Exception):
    pass


class CapitalError(Exception):
    pass


def name_validation(name) -> str:
    valid_cyrillic_chars = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
    if not isinstance(name, str):
        raise TypeError
    if not all([char.lower() in valid_cyrillic_chars for char in name]):
        raise CyrillicError
    if not name.istitle():
        raise CapitalError
    return name