가 나는 경우이 같은 선택이 기능을 많이 구현해야합니다에 따르면입력이 불법 인 경우 법적 인수 목록을 출력하는 방법은 무엇입니까?
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')
당신은' "A"를'매핑 뭔가를 찾고있어 ''뭔가하고 싶다',''B ''를''다른 것을해라 ', 등등. –
그러나 사전을 사용하면 최종 인상 오류 및 인쇄 단계를 수행해야합니다.이 단계는 데코레이터 또는 다른 "흑 마법"에 의해 실제로 피하고 싶습니다. –