我需要实现许多具有这种情况选择的函数:
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))
'''
根据"不要自己重复#34;,有没有办法避免重复引发错误的最后一步并打印正确的参数列表?我认为装饰师可能会这样做,但不知道如何制作它。提前谢谢。
我用检查模块自己实现了它。但我仍然希望能得到一些建议或更好的解决方案
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')
答案 0 :(得分:1)
我通常发现用词典更清楚地表达了“很多案例”模式。
我将在这里假设,对于每种情况,我们都有一个我们想要调用的不同函数,但如果每个值只是一个想要返回的整数,或者任何其他对象,则该模式有效。
e.g。 CASES
词典清楚而紧凑地向读者传达了不同情况下的代码。
CASES = {
'A': do_something,
'B': do_something_else,
...
}
def foo(bar):
if bar not in CASES:
raise ValueError('legal input of bar should be {}'.format(list_of_bar))
# do stuff
CASES[bar]()
另一种方法是使用'请求宽恕,而不是许可'模式。我发现在这个特殊情况下它并不像上面那样清楚。
def foo(bar):
try:
func = CASES[bar]
except KeyError:
raise ValueError(...)
# do stuff
func()
或者使用字典.get
方法作为另一种方式,但我认为它不像第一种方式那样清晰。
def foo(bar):
func = CASES.get(bar)
if func is None:
raise ValueError(...)
# do stuff
func()
答案 1 :(得分:1)
使用字典将可能的输入映射到操作,如下所示:
def foo(bar):
def a():
print('a():')
def b():
print('b():')
def c():
print('c():')
actions = {'A': a, 'B': b, 'C': c}
if bar in actions:
actions[bar]()
else:
raise ValueError('legal input of bar should be {}'.format(sorted(actions.keys())))
演示:
>>> foo('A')
a():
>>> foo('Z')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "x.py", line 15, in foo
raise ValueError('legal input of bar should be {}'.format(sorted(actions.keys())))
ValueError: legal input of bar should be ['A', 'B', 'C']