2013-05-16 40 views
2

我有一個功能,搜索查詢結果。如果沒有結果建議返回,False或None?在Python中,返回什麼結果,False或None?

我想這不是那麼重要,但我想遵循最佳實踐。

+4

如果函數返回如果有*結果,則爲非空列表,如果沒有空列表,返回空列表[]可能更有意義,那麼像get_result_list()中的項目一樣的代碼片段將會:無論如何工作。 – Aya

+5

當「True」可以時,'False'是有意義的。 「無」或空容器似乎更有意義。 –

+0

在這種情況下,積極的結果將是一個短字符串。 – user2387035

回答

1

我肯定不會返回False。但除NoneFalse之外,還有其他選擇。


的陽性結果將是在這種情況下的短字符串。

因此,否定的結果可能是空的字符串。 (除非這也是一種可能的陽性結果,當然)

由於PEP 8說:

對於序列(字符串,列表,元組),使用的事實,空序列爲假。

但是,這不是一個完整的答案你的問題(也不是一個鐵皮的規則,首先)。你必須考慮利弊,並決定哪些在實際使用中最重要。


我認爲最大的問題是這樣的:如果返回'',代碼嘗試使用結果作爲字符串工作。如果您返回None,那麼相同的代碼將引發異常。

例如,這裏有一些代碼,我已經得到了躺在身邊的簡化版本:

result = query_function(foo, bar) 
soup = bs4.BeautifulSoup(result) 
for div in soup.find_all('div'): 
    print(div['id']) 

query_function回報'',所以代碼將成功地打印出無標識。這就是我想要的腳本。但對於不同的用例,可能會更好地引發異常。在這種情況下,我會讓query_function返回None


或者,當然了,你可以讓query_function本身拋出一個異常,如綾的答案。


你可能想看看在標準的字符串的方法,re方法,並在STDLIB(甚至看sqlite等)等搜索功能,看看他們做什麼。 (請注意,在少數情況下,存在匹配的值對返回和異常提升函數,如str.findstr.index,因此答案可能不是其中之一,但兩者都可以。)

+0

+1很好的答案。我曾考慮添加返回空字符串的建議,但從這個問題來看,這是否是一個有效的積極結果並不明確。 – Aya

+0

@Aya:我也不清楚,但我想OP會知道,考慮這個問題對整個問題可能很重要。 – abarnert

3

在這種情況下,一個積極的結果將是一個短字符串。

假設你有這樣的事情(非常簡單)例子...

the_things = {'foo', 'bar'} 

def find_the_thing(the_thing): 
    if the_thing in the_things: 
     return the_thing 

...默認情況下將返回None如果沒有找到的東西,它是沒問題的,你可以使用這樣的......

the_thing = find_the_thing('blah') 
if the_thing is not None: 
    do_something_with(the_thing) 
else: 
    do_something_else() 

...但它有時不如養這樣一個異常....

the_things = {'foo', 'bar'} 

def find_the_thing(the_thing): 
    if the_thing in the_things: 
     return the_thing 
    raise KeyError(the_thing) 

...你可以用這樣的...

try: 
    do_something_with(find_the_thing('blah')) 
except KeyError: 
    do_something_else() 

...這可能是更具可讀性。

+2

'提高KeyError,the_thing'有些不推薦使用 - 而是使用'raise KeyError(the_thing)' –

+0

@JonClements更新了答案。 – Aya

+1

默認情況下,如果沒有找到'default'爲'None',那麼你也可以'返回默認值'。 'return default'和'raise KeyError'可能是有用的 – jfs

1

我會返回一個空的列表,它將爲您在路上查看該函數的返回值時節省頭痛。

如果你想讓你的程序在你做出假設列表中包含元素的情況下死掉,None是一個不錯的選擇。

+0

可能值得閱讀問題的評論 - 一個積極的結果返回一個字符串,而不是一個列表,所以返回列表的否定結果似乎沒有多大意義。 – Aya

+0

在這種情況下,一個空字符串,對閱讀理解抱歉失敗。字符串和列表雖然相似。 – beiller

0

如何不返回任何東西,但一個接一個地產生結果?生成器通常是一件很方便的事情,因爲它們避免了建立列表,然後無論如何都會被逐一使用和丟棄。

相關問題