【问题标题】:How to properly call a function within itself?如何正确调用自身内部的函数?
【发布时间】:2017-10-16 18:23:54
【问题描述】:

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

【问题讨论】:

  • “打电话给return就够了吗?” - 你试过了吗?发生了什么?
  • 也许我们在这里缺少代码,但您的参数都没有预先分配,您的目标是什么?你的问题对我来说似乎含糊不清。
  • @jonrsharpe,是的,我尝试过并且遇到了一些问题,但不确定它们是否与此特定行有关。结果我决定学习它是如何工作的。
  • @scharette,您所说的“没有预先分配您的参数”是什么意思?哪个参数没有赋值?
  • 好吧,如果result, error_text = myfunction(...) 的路径返回一连串的两件事,你希望它如何工作?您可以只使用return myfunction(...),然后您不必特别担心返回的内容。我不清楚你所说的“它是如何工作的” 是什么意思——你认为裸露的return 会做什么?

标签: python function recursion return-value


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你应该重新定义这个函数,这样它就只有一个返回值——它会更容易理解。当然,除此之外,所有 return 语句都必须尊重返回两个对象的函数签名。为什么会不一样?

      【讨论】:

        猜你喜欢
        • 2010-12-09
        • 1970-01-01
        • 2015-05-18
        • 1970-01-01
        • 2011-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多