I. Валидация пользователя

Используйте две предыдущих функции валидации и напишите функцию user_validation, которая принимает именованныеаргументы:

  • last_name — фамилия;
  • first_name — имя;
  • username — имя пользователя.

Если функции был передан неизвестный параметр или не передан один из обязательных, то вызовите исключение KeyError.

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

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

Если поле заполнено верно, функция возвращает словарь с данными пользователя.

Примечание

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

Пример

Ввод

print(user_validation(last_name="Иванов", first_name="Иван", username="ivanych45"))

Вывод

{'last_name': 'Иванов', 'first_name': 'Иван', 'username': 'ivanych45'}

Ввод

print(user_validation(last_name="Иванов", first_name="Иван", username="ivanych45", password="123456"))

Вывод

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

Решение

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

Если воспользоваться двумя ранее написанными функциями, то остается мелочь – убедиться, что все нужные переданы поля (именованные переменные).

Это можно сделать как через проверку наличия ключа в словаре, так и через попытку получить данные с использованием try/except. Если что-то пошло не так, вызываем исключение KeyError. В противном случае, проверям с помощью функции name_validation правильность имени и фамилии, а с помощью username_validation – имя учетной записи.

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

Решение

Python
class CyrillicError(Exception):
    pass


class CapitalError(Exception):
    pass


class BadCharacterError(Exception):
    pass


class StartsWithDigitError(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 name.capitalize() != name:
        raise CapitalError
    return name


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


def user_validation(*args, **kwargs) -> dict:
    allowed = ['last_name', 'first_name', 'username']
    user = kwargs

    try:
        if any([user[field] == '' for field in allowed]):
            raise KeyError
    except Exception:
        raise KeyError

    if not all([field in allowed for field in user.keys()]):
        raise KeyError

    name_validation(user['last_name'])
    name_validation(user['first_name'])
    username_validation(user['username'])

    return user