如何正确调用自身内部的函数?

时间:2017-10-16 18:23:55

标签: python function recursion return-value

当请求因授权问题而失败时,我应该从myfunction调用myfunction。请参阅下面的代码。

def myfunction(parm1, parm2, parm3, parm4=None):
    error_text = None
    result = None

    response, error_code = do_some_external_call()
    if error_code == 401: # auth_error
        login()
        result, error_text = myfunction(parm1, parm2, parm3, parm4)
        return result, error_text # ???
    if response:
        result = response.result
    return result, error_text

我应该在标有result, error_text的行返回???吗?或者仅仅拨打return

就足够了

3 个答案:

答案 0 :(得分:0)

当你可以使用一个简单的循环时,不要使用递归。

def myfunction(parm1, parm2, parm3, parm4=None):
    while True:
        response, error_code = do_some_external_call()
        if error_code == 401:
            login()
        else:
            break        
    return getattr(response, 'result', None), error_code

答案 1 :(得分:0)

直接返回函数很好,你可以在REPL中轻松地测试它。这是我能想到的最快的例子:

def reccy3(x):
    if x <= 1:
        return x, 1
    return reccy3(x-1)

对于您的代码,您似乎无法在任何地方设置error_text,因此我假设您的意思是error_code。您可以轻松修改以下内容以包含error_text,但是您正在使用它。

def myfunction(parm1, parm2, parm3, parm4=None):
    response, error_code = do_some_external_call()
    if error_code == 401: # auth_error
        login()
        return myfunction(parm1, parm2, parm3, parm4)
    if response:
        return response.result, None
    return None, error_code

答案 2 :(得分:-3)

你应该要求这个功能,所以它只有一个回报 - 它会更容易理解。除此之外,当然,所有返回语句都必须遵守返回两个对象的函数签名。为什么会有所不同?