2015-06-21 144 views
1

我有一个叫做crawl的函数,它会返回一个网站的链接。然后,我做这样的事情:如何使函数不返回任何内容?

found.append(crawl())(发现是一个列表)

这工作只要细如爬行返回一个有效的链接,但有时它不返回任何东西。所以值None被添加到列表中。

所以我的问题是,是否有可能从crawl返回的东西不会添加任何东西到列表中?

+4

作为一个脚注,这听起来像一个可怕的问题。 – Rishav

+5

不,这不可能仅仅因为'None' *是*什么都不是。你可以做的最好的是'retval = crawl();如果retval:found.append(retval)'。 – vaultah

+1

虽然在技术上你必须返回一些东西,即使它是'None',我不同意为了*实际*的目的,检查'None'不是唯一的可能性。当一个正在构建列表的函数遇到问题时,引发异常而不是返回'None'是一个非常合理的事情。如果导致'return None'或异常的情况不常见,异常处理可以比检查'None'具有更好的性能。 –

回答

10

在Python什么东西:None。你必须使用if条件:

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

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

found.extend(crawl()) 
+0

嗯。我喜欢第二个想法。 – Rishav

+1

这是什么'expand'功能?我尝试使用它时遇到异常。 – Rishav

+1

它应该是'extend'。我在答案中纠正了它。 –

1

这是不可能的。

您可以使用以下代码测试返回的None

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

'如果returned_link:'可能会错误地跳过追加,如果'crawl'可以返回,例如空字符串。如果你想测试'None',最好是明确的:'如果returned_link不是None:' – lvc

+0

@lvc,谢谢你。没有意识到空弦会影响条件。编辑答案以反映该建议。 –

2

你可以做的是通过在以抓取列表函数,如果有任何要添加的东西,否则不要。喜欢的东西:

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) 
1

如果一个函数返回它返回一个对象,即使对象是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是一种比较罕见的发生得更快。根据使用情况,代码可以更自由地解释函数出了什么问题。