J'essaie de trouver une bonne solution à cela et rien ne me vient à l'esprit. À titre d'exercice, je suis en train de créer un gestionnaire de contexte qui gère la validation des données, quelque chose comme:Gestionnaire de contexte pour valider les données
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
Au départ, je pensais à faire cela avec unittest.mock.patch
, mais je réalise que je ne peux pas appeler la fonction d'origine alors qu'il est patché, par exemple:
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
Puis je considérais écrire un décorateur pour valider une seule ligne, mais qui est vraiment utile que si vous pouvez faire quelque chose comme:
@validate(lambda x: int(x) == 6)
p = input("How many sides does a d6 have? ")
# can't decorate a function call
Je suis accroché à cette idée de gestionnaire de contexte, cependant. Malheureusement, je ne sais pas si un gestionnaire de contexte a un accès à son contenu, ou s'il est limité uniquement à ses arguments. Des pensées?
En aparté, je sais que je pourrais rendre cette fonctionnalité dans une fonction .: par exemple
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
Mais ce n'est pas aussi jolie. C'est, comme je l'ai dit, un exercice plus qu'un problème pratique.
Je dirais que c'est un peu plus conçu, bien! (Vous semblez être au courant de cela aussi, mais je me suis dit que je le dirais de toute façon.) – dano
Il n'y a pas d'ingénierie comme la sur-ingénierie. –