Я использую пакет 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
, принимая новую функцию каждый раз, когда она будет инициирована. Но я очень плохо себя чувствовал в теме декораторов.
Поэтому я прошу вас помочь мне найти более питонское решение этой проблемы.