Диспетчер контекста для проверки данных
Я пытаюсь обдумать хорошее решение, и ничего не приходит в голову. В качестве упражнения я пытаюсь создать менеджер контекста, который будет обрабатывать проверку данных, что-то вроде:
validation = lambda x: len(x) <= 10
with validator(validation):
some_data = input("Please enter a name of 10 characters or less: ")
print(some_data)
# OUTPUT
>> Please enter a name of 10 characters or less: FooBarSpamEggs
>> Please enter a name of 10 characters of less: Adam
Adam
Первоначально я думал о том, чтобы сделать это сunittest.mock.patch
но я понял, что не могу вызвать исходную функцию, пока она исправлена, например:
def patched(validation, *args):
while True:
p = __builtins__.input(args) # Doesn't work
if validation(p):
break
return p
with unittest.mock.patch('builtins.input', patched):
input("Some prompt here: ")
# fails on recursion error as patched calls itself
Затем я решил написать декоратор для проверки одной строки, но это действительно полезно, только если вы могли бы сделать что-то вроде:
@validate(lambda x: int(x) == 6)
p = input("How many sides does a d6 have? ")
# can't decorate a function call
Однако я зациклен на этой идее менеджера контекста. К сожалению, я не знаю, есть ли у менеджера контекста какой-либо доступ к его содержимому или он ограничен только своими аргументами. Какие-нибудь мысли?
Кроме того, я знаю, что мог бы представить эту функциональность в функции, например:
def validate_input(prompt, validation, msg_if_fail=None):
while True:
p = input(prompt)
if validation(p):
break
if msg_if_fail is not None:
print(msg_if_fail)
return p
Но это не так красиво. Это, как я уже сказал, упражнение больше, чем практическая проблема.