如何从助手函数中提前返回?

2024-04-27 15:43:23 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我认为我是聪明的,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

我把它改成

^{pr2}$

但后来我试了一下,意识到自从我搬走了早期的回报(“警卫”?)在helper函数中,它们当然不再工作了。现在,我可以很容易地在原始函数中添加一些代码来处理这些情况,但是如果不将复杂度重新移回到单个函数中并进行重复,似乎没有办法做到这一点。在

处理这种情况最优雅的方法是什么?在


Tags: 函数代码githubreturnif地方diffcondition
2条回答

您可以将a-specific stuffb-specific stuff提取到传递给helper函数的核心函数。然后助手将决定是否调用核心函数:

_helper(stuff, _core_func):
    if stuff == guard_condition:
        return early
    things = boilerplate
    return _core_func(things)

_a_core(_things):
    do a-specific stuff
    return late

_b_core(_things):
    do b-specific stuff
    return late

func_A(stuff):
    return _helper(stuff, _a_core)

func_B(stuff):
    return _helper(stuff, _b_core)

在理解助手返回VAL之前,请先回答

我会给_helper一个返回值:

^{pr2}$

这有帮助吗?在

 def common_stuff(f):
    def checked_for_guards(*args, **kwargs):
        if stuff == guard_condition:
            return early
        things = boilerplate
        else:
            return f(*args, **kwargs)
    return checked_for_guards

@common_stuff
def func_A(stuff):
    do A-specific stuff(things)
    return late

@common_stuff
def func_b(stuff):
    do B-specific stuff(things)
    return late

相关问题 更多 >