如何让函数啥都不返回?
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
更快。根据使用情况,它可能更具可读性,因为代码自然地解释了函数出了什么问题。
【讨论】:
以上是关于如何让函数啥都不返回?的主要内容,如果未能解决你的问题,请参考以下文章