【发布时间】:2016-11-25 19:43:35
【问题描述】:
所以我认为我很聪明,DRY 从一堆类似的函数中删除了一堆通用代码,并将它们变成了在一个地方定义的辅助函数。 (见GitHub diff)这样他们就可以从一个地方进行修改。 (见another GitHub diff)
原来是这样的
func_A(stuff):
if stuff == guard_condition:
return early
things = boilerplate + stuff
do A-specific stuff(things)
return late
func_b(stuff):
if stuff == guard_condition:
return early
things = boilerplate + stuff
do B-specific stuff(things)
return late
我把它改成了
_helper(stuff):
if stuff == guard_condition:
return early
things = boilerplate + stuff
return things
func_A(stuff):
things = _helper(stuff)
do A-specific stuff(things)
return late
func_B(stuff):
things = _helper(stuff)
do B-specific stuff(things)
return late
但后来我尝试了一下,发现由于我将早期返回(“守卫”?)移到了辅助函数中,它们当然不再工作了。现在我可以轻松地向原始函数添加一些代码来处理这些情况,但似乎没有办法做到这一点,除非再次将复杂性移回各个函数并重复。
处理这种情况最优雅的方法是什么?
【问题讨论】:
-
哦,这就是装饰器的用途吗?
-
啊但是如果要包装的函数带不同数量的参数,你需要在装饰器中使用
*args,然后它就变成了函数签名,这很丑。