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.