【问题标题】:Python function returns None in elif or elsePython函数在elif中返回None,否则
【发布时间】:2018-06-16 11:21:28
【问题描述】:

我有 dict 类型的变量 r。变量 item 保存项目列表,total_results 是一个 int。只要满足项目数小于项目总数的条件,就递归调用该函数。但是,如果我测试项目是否等于总结果,return 语句将返回 None。将此 elif 更改为 if 确实会返回正确的值。

有人能指出我正确的方向来找出为什么在 elif 或 else 块中返回 r 会产生 None 吗?

非常感谢!!

相关代码sn-p:

if len(items) < total_results:
    params['start_index'] = len(items)

    self.fetch_company_officers(company_number=company_number, items=items, **params)

elif len(items) == total_results:
    r['items'] = items
    return r

完整代码:

def fetch_company_officers(self, company_number, items=None, **kwargs):
    uri = 'company/{}/officers'.format(company_number)
    params = kwargs

    r = self.make_request(uri=uri, **params)

    # Test if items are set
    if items is None:
        items = r['items']
    else:
        items.extend(r['items'])

    # Iterate multiple pages
    total_results = r['total_results']

    if len(items) < total_results:
        params['start_index'] = len(items)

        self.fetch_company_officers(company_number=company_number, items=items, **params)

    elif len(items) == total_results: # TO DO: ??
        r['items'] = items
        return r

【问题讨论】:

  • 你能介绍一下整个递归函数吗?
  • 如果执行流经您的if 块而不是您的elif 块,会得到什么returned? (请记住,如果没有明确返回,则返回 None
  • 这里是完整的代码,看我的原帖。
  • 我认为您应该首先检查两者的值是什么 1. Len(items) 2. Total_results 使用打印功能

标签: python recursion return


【解决方案1】:

我想我理解你想要做什么,但递归不是这里的方法。只要 (while) 您检索到的项目数小于您预期的结果总数,您就希望继续从下一页获取项目。所以.. 让我们使用while 循环!

这是我的代码版本。请注意,我无法对此进行测试,因为我没有您的其余代码。

def fetch_company_officers(self, company_number, **params):

    # Start with an empty list of items
    items = []

    # Make the first request
    uri = f"company/{company_number}/officers"
    response = self.make_request(uri=uri, **params)

    # Extract information from the first batch
    items += response.get("items", [])
    total_results = response.get("total_results")

    # Stop iterating when we don't know the total number of results to expect
    if total_results is None:
        return items

    # Keep getting more results until our list of items
    # is as long as the total number of results we expect
    while len(items) < total_results:

        # Get the next page
        response = self.make_request(uri=uri, start_index=len(items), **params)

        # Extract information from this batch
        items += response.get("items", [])

    # We've now retrieved everything
    return items

【讨论】:

    【解决方案2】:

    您的函数缺少len(items) &gt; total_results 的以下场景的处理逻辑。

    所以函数到达行尾并默认返回None

    【讨论】:

    • 你好。我也在考虑这个问题,但由于代码无法获得比现有更多的项目,我认为这不应该是问题的原因。我尝试添加条件,但仍然没有收到。
    猜你喜欢
    • 2022-12-25
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 2014-08-28
    • 2013-04-07
    相关资源
    最近更新 更多