Как создать пользовательский валидатор в модуле Python Clint - PullRequest
0 голосов
/ 29 августа 2018

Я использую пакет Python с именем Clint для предварительной обработки входных данных, необходимых в моем приложении. В пакете вы можете получить доступ к модулю validators и использовать его в сочетании с prompt, чтобы правильно попросить пользователей ввести данные.

Я искал возможность реализовать пользовательский валидатор в Clint из-за относительно короткого списка встроенных классов валидаторов в модуле:

[FileValidator, IntegerValidator, OptionValidator, PathValidator, RegexValidator, ValidationError]

Итак, я написал код ниже:

from clint.textui import prompt, validators

class NumberValidator(object):
    message = 'Input is not valid.'

    def __init__(self, message=None):
        if message is not None:
            self.message = message

    def __call__(self, value):
        """
        Validates the input.
        """
        try:
            if int(value) > 10:
                return value
            else:
                raise ValueError() 
        except (TypeError, ValueError):
            raise validators.ValidationError(self.message)

answer = prompt.query(f'Insert range in days:',
                      '365',
                      validators=[NumberValidator("Must to be > 10")],
                      batch=False)
print(answer)

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

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

Поэтому я прошу вас помочь мне найти более питонское решение этой проблемы.

1 Ответ

0 голосов
/ 29 августа 2018

Не уверен, что это лучший способ, но я могу найти способ лучше решить эту проблему. В приведенном ниже коде я могу создать столько пользовательских функций, сколько захочу (custom_validation_1, custom_validation_2, custom_validation_3 ...), а затем просто изменить параметр validators в prompt.query

from clint.textui import prompt, validators


class InputValidator(object):
    message = 'Input is not valid.'

    def __init__(self, fun, message=None, *args):
        if message is not None:
            self.message = message
        self.my_function = fun
        self.my_args = args

    def __call__(self, value):
        """
        Validates the input.
        """
        try:
            return self.my_function(value, *self.my_args)
        except (TypeError, ValueError):
            raise validators.ValidationError(self.message)


def custom_validation_1(value, number):
    if int(value) > int(number):
        return value
    else:
        raise ValueError


answer = prompt.query(f'Insert range in days:',
                      '365',
                      validators=[InputValidator(custom_validation_1,
                                                 "Must to be greater than 10",
                                                 10)],
                      batch=False)
print(answer)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...