J'ai besoin de mettre en œuvre beaucoup de fonctions qui ont la sélection des cas comme celui-ci:Comment afficher la liste des arguments juridiques lorsque l'entrée est illégale?
def foo1(bar1):
if bar1 == 'A':
do something
elif bar1 == 'B':
do something
elif ...
...
else:
raise ValueError('legal input of bar1 should be {}'.format(list_of_bar))
def foo2(bar2):
if bar2 == 'A':
do something
elif bar2 == 'B':
do something
elif ...
...
else:
raise ValueError('legal input of bar2 should be {}'.format(list_of_bar))
'''
Selon « Ne répétez pas vous-même », est-il un moyen d'éviter de répéter la dernière étape d'une erreur de relance et imprimer la liste des arguments corrects? Je pensais qu'un décorateur pourrait le faire, mais je ne sais pas comment le faire. Merci d'avance.
mise à jour
je moi-même mis en œuvre avec l'inspection module. Mais je l'espère peut encore obtenir des conseils ou de meilleures solutions
import inspect
from functools import wraps
import re
def test_none(func):
_code = inspect.getsource(func)
_list = re.findall(r'if (\w+) == (\w+)', _code)
assert all(_list[0][0] == name for name, case in _list)
_arg = _list[0][0]
_case = tuple(case for name, case in _list)
@wraps(func)
def wrapper(*args, **kwargs):
results = func(*args, **kwargs)
if results is None:
raise ValueError(
'Legal value of \'{arg}\' should be anyone of {case}'.format(
arg=_arg, case=_case))
return results
return wrapper
@test_none
def foo(bar):
if bar == 0:
return 1
elif bar == 1:
return 2
Exemple de test:
foo(3)
ValueError: Legal value of 'bar' should be anyone of ('0', '1')
Vous cherchez quelque chose qui associe ' "A"' «faire quelque chose», «B» 'faire autre chose, etc. En d'autres termes, vous voulez un dict. –
Mais avec un dictionnaire, je dois aussi faire l'erreur finale d'élévation et d'impression, que je veux vraiment éviter par un décorateur ou autre "magie noire". –