Как стать автором
Обновить

Комментарии 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, имя, фамилию, т.п. В таком случае лучше использовать универсальное решение.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации