2010-10-26 51 views
33

我不知道在不需要時跳過return None是不是壞方法。跳過「返回無」可以嗎?

實施例:

def foo1(x): 
    if [some condition]: 
     return Baz(x) 
    else: 
     return None 

def foo2(x): 
    if [some condition]: 
     return Baz(x) 

bar1 = foo1(x) 
bar2 = foo2(x) 

在這兩種情況下,當條件爲假,功能將與None返回。

回答

50

就像你說的,return None(幾乎)從來沒有需要。

但是你應該考慮你的代碼的意圖明確的return None更清晰。請記住:一段代碼也需要被人類讀取,並且明確地通常是有幫助的。

+1

也有助於符合'import this':P – 2010-10-26 20:19:55

+0

關於'__init__'方法的結尾?既然你不能'返回None',那麼最好是有'return'還是什麼也不做? – dln385 2010-10-26 20:32:34

+0

@ dln385:你可以在__init__中返回None,實際上這就是return的作用。 – adw 2010-10-26 20:35:46

4

是和

號在最簡單的情況下,它是確定跳過「返回None」,因爲它沒有返回只有單一的負面狀態。

但是,如果存在嵌套條件評估和多種方案,其中一個功能可以返回無。我傾向於將它們包括爲場景的可視文檔

[編輯:基於下面的評論]

return or return None

我喜歡「迴歸無」裸「返回」,因爲它是明確的,後來,沒有人會懷疑,如果返回意味着返回沒有或者是錯過了一些錯誤。

+0

即使嵌套,你可以使用'return'而不是'return None'。有時候可以更清楚地說明「無」,但通常人們使用「無」來表示某種特殊情況,在這種情況下,提出明確的例外情況會更好。 – adw 2010-10-26 20:24:06

+0

@adw:我同意你的看法。其中一些是風格習慣。我憎惡使用「返回」,就好像我錯過了返回的東西。在這種情況下,我更願意「返回無」,因爲我明確表示這是我想要的。 – pyfunc 2010-10-26 20:37:22

+0

我個人不會將「無」用於特殊價值,但通常用它作爲佔位符來指示有價值的位置。 []或()然後指示結果數量不確定,對於某種功能它們更好False-like value than return無(因爲None不可迭代) – 2010-10-26 21:02:18

2

是的,如果你不從Python函數返回任何值,返回None。因此,是否明確地返回無是一個文體決定。

就個人而言,我更願意爲了清晰而始終返回一個值。

21

來闡述對別人怎麼說,我用一個return None如果函數應該返回一個值。在Python中,所有函數都會返回一個值,但是我們經常編寫只返回None的函數,因爲它們的返回值被忽略。在某些語言中,這些將被稱爲程序。

因此,如果一個函數應該返回一個值,然後我要確保所有代碼路徑有回報,這回報有一個值,即使它是無。

如果一個函數「不」返回一個值,也就是說,如果它從來沒有被某個人用它的返回值調用,那麼沒有返回就可以結束,如果我需要提前返回,我使用裸露的表格,return

0
def foo1(x): 
    try: 
     return Baz(x) 
    except: 
     raise ValueError('Incorrect value fo Bac') 

def foo3(x): 
    return Baz(x) if <condition> else False 

我不相信一半定義的功能,但這種假可在搜索類型的故障修剪有用。

0

我越去想它,少我覺得你描述的情況下顯示出良好的實踐。它迫使客戶區分,所以客戶端代碼幾乎總是看起來像:

b = foo1(123) 
if b is not None: 
    ... 

你甚至不能寫:

if b: 
    ... 

,因爲如果Baz.__nonzero__被覆蓋,B可以評價爲False,即使它不是無。這將是最好有一個Null-Baz實例(AKA Null Object),例如:

class Baz(object): 
    def some_method(self): 
     """some action:""" 
     ... 
    ... 

class BazNull(Baz): 
    def some_method(self): 
     """nothing happens here""" 
    ... 

Baz.Null = BazNull() 

... 

def foo1(x): 
    if some_condition: 
     return Baz(x) 
    else: 
     return Baz.Null 

... 

b = foo1(123) 
b.some_method() 

點是:(!誰可能是你自己)幫助客戶保持Cyclomatic Complexity低。分支越少越好。

+0

好點。但在某些情況下,我不得不返回None。 IE瀏覽器。在Django中間件中,您將在大多數方法中返回None。 – 2010-10-29 06:54:44

+0

我低估了這一點,因爲即使該建議在某些情況下有效,它也不在問題的範圍之內。 – ehabkost 2017-05-29 17:09:57