如何正确调用其中的函数?

问题描述:

当请求由于授权问题而失败时,我应该从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就足够了?

+5

*“只要调用'return'就足够了吗?” - - 你试过了吗?发生了什么? – jonrsharpe

+0

也许我们在这里缺少代码,但是您的参数没有事先分配,您的目标是什么?你的问题似乎对我很模糊。 – scharette

+0

@jonrsharpe,是的,我尝试了一些问题,但不确定它们是否与此特定行有关。结果我决定了解它是如何工作的。 –

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

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

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 

只需直接返回函数就可以了,您可以在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