Administrador de contexto para validar datos

Estoy tratando de reflexionar sobre una buena solución para esto y no se me ocurre nada. Como ejercicio, estoy tratando de crear un administrador de contexto que maneje la validación de datos, 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 pensé en hacer esto conunittest.mock.patch pero me di cuenta de que no puedo llamar a la función original mientras está parcheada, por ejemplo:

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

Luego consideré escribir un decorador para validar una sola línea, pero eso realmente solo es útil si pudieras hacer algo como:

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

Sin embargo, estoy colgado de esta idea de administrador de contexto. Desafortunadamente, no sé si un administrador de contexto tiene acceso a su contenido, o si se limita solo a sus argumentos. ¿Alguna idea?

Como comentario aparte, sé que podría representar esta funcionalidad en una función, por ejemplo:

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

Pero no es tan bonito. Este es, como dije, un ejercicio más que un problema práctico.

Respuestas a la pregunta(2)

Su respuesta a la pregunta