如何让函数啥都不返回?

Posted

技术标签:

【中文标题】如何让函数啥都不返回?【英文标题】:How to make a function return nothing?如何让函数什么都不返回? 【发布时间】:2015-09-07 01:07:20 【问题描述】:

我有一个名为crawl 的函数,它将返回一个网站链接。然后我做类似的事情:

found.append(crawl())(找到的是一个列表)

只要 crawl 返回一个有效的链接,它就可以正常工作,但有时它不会返回任何内容。因此,None 的值被添加到列表中。

所以我的问题是,是否有可能从 crawl 返回不会向列表添加任何内容的内容?

【问题讨论】:

作为一个脚注,这听起来像是一个可怕的问题。 不,这不可能仅仅因为None 什么都没有。你能做的最好的就是retval = crawl(); if retval: found.append(retval) 虽然从技术上讲你必须返回一些东西,即使它是None,我不同意出于实际目的检查None不是唯一的可能性。当正在构建列表的函数遇到问题时,引发异常而不是返回None 是一件非常合理的事情。如果导致return None 或异常的条件不常见,则异常处理可以比检查None 具有更好的性能。 【参考方案1】:

在 Python 中什么都不是:None。你必须使用 if 条件:

link = crawl()
if link is not None:
    found.append(link)

或者让crawl返回一个列表,它可以包含一个或零个元素:

found.extend(crawl())

【讨论】:

嗯。我喜欢第二个想法。 expand 函数是什么?尝试使用时出现异常。 应该是extend。我在答案中更正了它。【参考方案2】:

您可以做的是将列表传递给 crawl 函数,如果有任何要添加的内容,请附加它,否则不添加。比如:

def crawl(found):
   """ Add results to found list """
   # do your stuff saving to result
   if result is not None:
       found.append(result)

# Call this as 
   crawl(found)

【讨论】:

【参考方案3】:

这是不可能直接的。

您可以使用以下代码测试是否返回了 None

returned_link = crawl()
if returned_link is not None:
    found.append(returned_link)

【讨论】:

如果crawl 可以返回例如空字符串,if returned_link: 可能会错误地跳过追加。如果你想测试None,最好是明确的:if returned_link is not None: @lvc,谢谢。没有意识到空字符串会影响条件。编辑了答案以反映建议。【参考方案4】:

如果一个函数返回它必须返回一个对象,即使该对象是None。但是,还有另一个答案被忽略了,那就是引发异常而不是返回None

正如其他人指出的那样,一种方法是在将返回的对象附加到列表之前检查返回的对象是否为None

link = crawl()
if link is not None:
    found.append(link)

另一种方法是定义一些异常,可能是WebsiteNotFoundError,并让crawl 执行raise WebsiteNotFoundError 而不是return None。然后你可以写:

try:
    found.append(crawl())
except WebsiteNotFoundError:
    pass  # or take appropriate action

异常处理方法的优点是,如果与返回有效链接相比,返回None 是相对罕见的情况,它通常比检查None 更快。根据使用情况,它可能更具可读性,因为代码自然地解释了函数出了什么问题。

【讨论】:

以上是关于如何让函数啥都不返回?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个在 React 中啥都不做的函数

如何编写一个在给定时间长度内啥都不做的函数? [复制]

R:如何在向量上使用类似“if”的函数但没有“ifelse”,因为如果没有,它应该啥都不做

在if语句之后返回vs啥都不做[重复]

C++(0x) 中是不是存在无操作“啥都不做”函数对象?

想让 HTML 表单提交啥都不做