Комментарии 12
Давно существует attrs, которая качественно и полностью закрывает все потребности в области валидация в python. Кроме того, в ней можно гибко настроить не только валидацию, но и преобразование данных, без чего в больших проектах не обойтись.
С другой стороны, вы попрактиковались, получив таким образом собственный опыт, это тоже отлично
Поверьте это не так. Мы использовали в ряде проектов и pydantic, в итоге отказались от него из соображений скорости, возможности гибкой настройки. Тот факт, что attrs ещё и позволяет на выходе получать удобные модели , только повышает удобство его использования.
Ещё раз отдельно сфокусирую внимание на возможности гибкой настройки в attrs, не буду скрывать, мы дописывали свои модели валидации и конвертации для attrs, и да, там есть ряд нюансов, которые , при активном использовании, устранить можно только доработкой. Возможно мы засушим свои наработки в общий репозиторий.
Можно пожалуйста поподробнее о том, в чем именно вам не хватило гибкости pydantic?
Это в скором времени вполне могут поправить.
Что касается преобразования или сериализации, это важная тема, выходящая за рамки данной библиотеки статьи, возможно, тут пригодится attrs.
A так же соглашусь, что библиотек, которые способны валидировать данные много, но не все ориентированы на конечного пользователя (обычного пользователя). Например, не всем может быть понятна надпись:
# стандартное сообщение об ошибке в attrs, при проверке на тип int:
"'x' must be <class 'int'> (got '128' that is a <class 'str'>).", Attribute(name='x', default=NOTHING, validator=[<instance_of validator for type <class 'int'>>, <function fits_byte at 0x10fd7a0d0>], repr=True, cmp=True, hash=True, init=True, metadata=mappingproxy({}), type=int, converter=None, kw_only=False), <class 'int'>, '128'
Гораздо понятнее будет:
# стандартное сообщение в respect_validation
"128" must be of type integer
Все зависит от поставленных задач, а так же удобства использования при разработке.
Подскажите, а что с производительностью? Что быстрее если банально сравнить
if type(var) == str
Или var.stringType?
# Я думаю, быстрее и практичнее сделать так:
if isinstance(var, str):
Конечно же, если вам надо проверить только тип данных, то вам не надо использовать сторонние библиотеки, а пользоваться встроенными функциями. Данная библиотека нужна для проверки многих параметров. Например, username должен быть:
Тип str (
if not isinstance(var, str): # return error
)Длинна от 4 до 64 включительно(
if not 4 <= len(var) <= 64: # return error
)Не содержать пробелы (
if ' ' in var: # return error
)Содержать только латинские буквы или цифры (
if not var.isalnum(): # return error
)Не быть равным admin или root (
if var in ['admin', 'root']: # return error
)
Как вы можете заметить задача усложнилась. Кроме того, что вам надо написать много if
, вам так же надо продумать сообщения, которые надо отправить пользователю. Вот здесь может пригодиться библиотека валидации. :)
в 3.10 версии питона появился паттерн матчер, видел примеры как раз на валидации входных данных(сам не использовал). Хотелось бы посмотреть в сравнении с вашим решеним в разрезе простота/удобство/скорость.
Как я понимаю, "паттерн матчер" это что-то типа switch/case (например, у PHP или Bash). Как по мне, то это немного для других целей, не для валидации.
Но! Если вы что-то можете сделать быстро средствами самого Python, то я рекомендую не прибегать к использованию библиотек, гораздо быстрее решить простые задачи локальными средствами. А уже если вам надо произвести сложную задачу, то чтобы "не изобретать велосипед", я рекомендую использовать дополнительные библиотеки. В моём комментарии выше, есть пример, где входящее значение должно пройти 5 правил и это только для username, а надо проверить еще пароль, email, имя, фамилию, т.п. В таком случае лучше использовать универсальное решение.
Respect Validation на Python