Context Manager zum Überprüfen von Daten

Ich versuche über eine gute Lösung nachzudenken und mir fällt nichts ein. Als Übung versuche ich, einen Kontextmanager zu erstellen, der die Datenüberprüfung übernimmt. Beispiel:

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

Ursprünglich habe ich darüber nachgedacht, dies mit @ zu tuunittest.mock.patch aber mir ist aufgefallen, dass ich die ursprüngliche Funktion nicht aufrufen kann, während sie gepatcht ist,

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

Dann habe ich überlegt, einen Decorator zu schreiben, um eine einzelne Zeile zu validieren, aber das ist wirklich nur nützlich, wenn Sie etwas tun könnten wie:

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

Ich habe mich jedoch auf diese Context Manager-Idee festgelegt. Leider weiß ich nicht, ob ein Kontextmanager Zugriff auf seine Inhalte hat oder nur auf seine Argumente beschränkt ist. Irgendwelche Gedanken?

bgesehen davon weiß ich, dass ich diese Funktionalität in einer Funktion rendern kann,

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

Aber es ist nicht so schön. Dies ist, wie gesagt, mehr eine Übung als ein praktisches Problem.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage