Gerenciador de contexto para validar dados

Estou tentando refletir sobre uma boa solução para isso e nada está vindo à mente. Como exercício, estou tentando criar um gerenciador de contexto que lide com a validação de dados, algo como:

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

Originalmente, pensei em fazer isso comunittest.mock.patch mas percebi que não posso chamar a função original enquanto estiver corrigida, por exemplo:

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

Então considerei escrever um decorador para validar uma única linha, mas isso é realmente útil apenas se você puder fazer algo como:

@validate(lambda x: int(x) == 6)
p = input("How many sides does a d6 have? ")
# can't decorate a function call

No entanto, estou com essa ideia de gerente de contexto. Infelizmente, não sei se um gerenciador de contexto tem acesso ao seu conteúdo ou se é limitado apenas a seus argumentos. Alguma ideia?

Como um aparte, eu sei que poderia renderizar essa funcionalidade em uma função, por exemplo:

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

Mas não é tão bonito. Este é, como eu disse, um exercício mais que um problema prático.

questionAnswers(2)

yourAnswerToTheQuestion