Используйте две предыдущих функции валидации и напишите функцию 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 – имя учетной записи.
Посмотреть код
Решение
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