Может ли значение TextField объекта Django не скомпилироваться как шаблон регулярного выражения? - PullRequest
0 голосов
/ 08 апреля 2019

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

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 голос
/ 08 апреля 2019

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...