【问题标题】:Python: Why my function returns None and then executesPython:为什么我的函数返回 None 然后执行
【发布时间】:2017-12-10 14:30:42
【问题描述】:

所以,我有一个基本上可以做到这一点的功能:

import os
import json
import requests
from openpyxl import load_workbook

def function(data):
    statuslist = []
    for i in range(len(data[0])):
        result = performOperation(data[0][i])
        if result in satisfying_results:
            print("its okay")
            statuslist.append("Pass")
        else:
            print("absolutely not okay")
            statuslist.append("Fail" + result)
    return statuslist

然后,我像这样调用函数(我添加了错误处理以检查在偶然发现我提出这个问题的原因后会发生什么),并且实际上对结果感到惊讶,因为函数返回 None,并且然后执行:

statuslist = function(data)
print(statuslist)
try:
    for i in range(len(statuslist)):
        anotherFunction(i)
        print("Confirmation that it is working")
except TypeError:
    print("This is utterly nonsense I think")

那么程序的输出如下:

None
This is utterly nonsense I think
its okay
its okay
its okay
absolutely not okay
its okay

函数末尾只有一个return语句,该函数不是递归的,它非常直接且自顶向下(但同时解析了大量数据)。

从输出日志看来,该函数首先返回 None,然后正确执行。我很困惑,我无法在互联网上找到任何类似的问题(也许我错误地表达了这个问题)。 即使代码中存在一些不一致的地方,我仍然希望它返回 []。

将初始列表更改为statuslist = [“WTF”]后,返回为[]。 为了排除我在函数(数据)中执行的一些其他函数中修改列表的事实,我已经多次更改初始列表的名称 - 结果始终超出我的理解

我将非常感谢调试问题的提示。为什么函数先返回值,后执行?

【问题讨论】:

  • 似乎没有足够的信息来重现这一点。您是指第一个函数的 for 循环中的 data[0] 吗?如果你注释掉很多代码,然后将其添加回来看看会发生什么?
  • 您是否检查过您导入的模块没有在导入时运行的代码。 os、json 和 request 我认识,所以它们没问题,但您导入的第三方模块可能有在导入时运行的代码,这将是我的第一次检查。
  • 如果没有dataperformOperation()satisfying_resultsanotherFunction,则无法重现问题。
  • 不可重现。提供minimal reproducible example
  • 嗯,还有很多嵌套在其中的函数,但它们所做的只是从 excel 读取数据,将数据提供给 requests 模块使用的调用的定义,然后发送那些调用服务器。我将检查注释掉部分代码,看看我是否可以找出罪魁祸首。我试图将函数最小化到它的根,因为完整的代码以及所有 API 调用定义需要大约 300 行。

标签: python return nonetype


【解决方案1】:

虽然无法编写能够同时全面呈现我的代码中发生的事情、可读且不会干扰公司安全政策的代码,但我已将其重写为更简单的形式(原始代码是在我有 3 个月的编程经验时编写的),并且问题不再重现。我猜我误解了某种程度的函数嵌套,而这个重写的代码,做的几乎一样,正确地返回了预期的列表。

感谢大家的宝贵时间和建议。

所以,答案似乎是:你不了解自己的代码,让它更简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-03
    • 2021-12-23
    • 1970-01-01
    • 2021-11-13
    相关资源
    最近更新 更多