Диспетчер контекста для проверки данных

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

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

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

Ответы на вопрос(2)

Ваш ответ на вопрос