私はこのようなケースの選択持っている機能の多くを実装する必要があります。昇給エラーの最後のステップの繰り返しを避けるし、印刷するどのような方法があり、「それを自分で繰り返してはいけない」によると入力が不正な場合の法的引数のリストの出力方法は?
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))
'''
を正しい議論のリスト?私はデコレータがこれを行うかもしれないと思ったが、それを作る方法を確かめなかった。前もって感謝します。
更新
inspectモジュールを使用して実装しました。しかし、私はまだいくつかのアドバイスや、より良いソリューション
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
試験例を得ることができることを望む:
foo(3)
ValueError: Legal value of 'bar' should be anyone of ('0', '1')
:
デモ「何かをする」、「何かをする」などをするために「B」を使います。 –
しかし、辞書では、私は本当にデコレータや他の "黒い魔法"によって避けたい、最終的なエラーと印刷のステップを行う必要があります。 –