Может ли значение текстового поля объекта Django не скомпилироваться как шаблон регулярных выражений?

#python #django #regex #re

#python #django #регулярное выражение #python-re

Вопрос:

Я пытаюсь создать систему, в которой пользователи смогут определять и тестировать свои собственные шаблоны регулярных выражений. Для этого у меня есть следующая настройка:

 import re

class ExtendedRegexValidator(models.Model):
    pattern = models.TextField(
        _('pattern'),
        help_text=_('Required. Must be a valid regular expression pattern.')
    )

    def save(self, *args, **kwargs):
        try:
            re.compile(self.pattern)
        except Exception as e:
            # handle exception
        super(ExtendedRegexValidator, self).save(*args, **kwargs)
  

Перед сохранением я пытаюсь скомпилировать шаблон регулярных выражений, используя значение pattern поля модели, которое является TextField . Действительно ли это необходимо? Есть ли более идеальный способ сделать это? Это своего рода хакерство.

Комментарии:

1. Выполните проверку при отправке формы. И да, некоторые шаблоны не будут скомпилированы.

Ответ №1:

Действительно ли это необходимо?

Да, проверка необходима, так как будут допустимые строки, которые не являются допустимыми регулярными выражениями. Смотрите документы Python на re.error :

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

Другие предлагали вместо этого выполнить эту проверку во время отправки формы, но ради целостности данных, я думаю, вы были правы, сделав это на уровне модели. При вашей обработке re.error вы можете вызвать ValidationError , которое может быть обнаружено на уровне отправки формы.

Есть ли более идеальный способ сделать это? Это своего рода хакерство.

Ваш код проверки соответствует философии Python EAFP:

Проще попросить прощения, чем разрешения. Этот распространенный стиль кодирования на Python предполагает существование допустимых ключей или атрибутов и улавливает исключения, если предположение оказывается ложным. Этот чистый и быстрый стиль характеризуется наличием множества операторов try и except . Этот метод отличается от стиля LBYL, общего для многих других языков, таких как C.

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