H. Валидация имени пользователя

Продолжим реализацию системы валидации.

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

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

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

  • BadCharacterError — вызывается, если значение состоит не только из латинских букв, цифр и символа нижнего подчёркивания;
  • StartsWithDigitError — вызывается, если значение начинается с цифры.

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

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

Примечание

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

Пример

Ввод

print(username_validation("$user_45$"))

Вывод

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

Ввод

print(username_validation("45_user"))

Вывод

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

Решение

Продолжение серии задач на валидацию пользовательских данных.

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

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

Решение

Python
class BadCharacterError(Exception):
    pass


class StartsWithDigitError(Exception):
    pass


def username_validation(username) -> str:
    valid_username_chars = 'abcdefghijklmnopqrstuvwxyz_0123456789'
    if not isinstance(username, str):
        raise TypeError
    if not all([char.lower() in valid_username_chars for char in username]):
        raise BadCharacterError
    if username[0].isdigit():
        raise StartsWithDigitError
    return username