2012-11-09 53 views
9

我在PEP 8中找不到任何有關的內容。我對你對沒有任何回報的函數最pythonic語法的想法感興趣?功能最強大的pythonic方式沒有回報?

是否有任何理由阻止功能,而無需返回管線(例如3)?

實施例1:

def foo(): 
    print 'foo' 
    return None 

實施例2:

def foo(): 
    print 'foo' 
    pass 

實施例3:

def foo(): 
    print 'foo' 
+16

例3 ofcourse! – rantanplan

+3

你不應該在這裏使用'pass'語句。來自doc:「當語句需要語法時可以使用,但程序不需要任何操作。」 – Nicolas

+4

爲什麼你會使用前兩個? – TC1

回答

16

保持簡單。例3是最pythonic的方式。

>>> import this 

The Zen of Python, by Tim Peters 

... 
Simple is better than complex. 
... 
+0

但顯式比隱式更好。 – glglgl

+5

我們不會通過拋出與系統設計相關而不是代碼語法的警句來達成任何目的。 Thg435的答案要好得多,因爲它包含了關於如何最好地表達你想要代碼的含義的反思。 – madjar

7

如果函數返回一個值,這可能是None一些情況下,return None好。

如果函數沒有返回值,但要提前返回,使用return不帶任何參數。在最後一行,你可以省略它。

pass什麼也不做,而只有當需要聲明avoir語法錯誤有用的(在一個空的類,例如)

+1

提及沒有價值的'return'。 – brandizzi

14

有兩個用例是:

  • 一個函數,從不返回任何東西(又名「程序」)。你應該完全省略返回。
  • 一個函數,返回無輸入的一些輸入。我個人更喜歡把return None那裏,因爲否則可能會略有混淆讀者:

例如:

def find_user(name): 
    if database.is_ready(): 
     return database.find_user_by_name(name) 
    else: 
     return None 

從技術上講,你可以刪除else一部分,但它們將使得這個功能看起來很奇怪。

+6

這是現在醜陋的做法,我從讀者的角度講話。沒有別的,只返回None! – Denis

+0

+1給丹尼斯。 'else'是不必要的代碼。 – rantanplan

+6

從執行的角度來看,這是不必要的,但它可以向讀者表明這個函數將返回None。數據庫沒有按照設計準備好,而且它不僅僅是作者忽略的東西。 – madjar

-1

正如其他人指出方案3是目前最好的。

更多的原因選項3是一個好主意,許多人認爲None(別的語言中的null)一般不會返回,您應該拋出異常或使用Null對象模式。儘管我並不完全同意我認爲在語義上沒有意義且不明確的情況下,特別明確地避免使用None有一些有效的觀點。

我不是說你不應該回到None但總的來說,我不認爲這是一個好主意。

你甚至可以在Python中看到這個,blah['DOESNOTEXIST']會拋出一個異常,其中Java map.get("DOESNOTEXIST")將返回null

+1

*很多人都認爲*這些人是誰?每個'__init__'都返回'None'。這就是它應該如何。這是一個非常有效且正常的回報值。在Python中也是'dict.get('doesntexit')'返回'None'。 – SilentGhost

+0

很多人都是FP程序員。許多語言不具有null的概念。很多人都是託尼霍爾,他是空值的發明者:*我稱之爲我十億美元的錯誤。 1965年發明了空值參考。...但我無法抗拒放入空引用的誘惑,因爲它很容易實現。這導致了無數的錯誤,漏洞和系統崩潰,這可能在過去四十年中造成了數十億美元的痛苦和破壞。但是,Pythonic有時候會......絕對地返回「無」。 –

+0

說真的......我因爲我說過避免使用null而沒有意義! 'dict.get('doesntexist')'是一個不好的例子。 你是否在地圖中綁定了'None'或者它不存在? Python中有許多因爲歷史原因而工作的東西,我討厭人們說它保持簡單。簡單是一個意見。 –

6

PEP8了關於該議題的建議:

在return語句是一致的。 全部爲,函數返回語句應該返回一個表達式,或者它們應該。如果任何return語句返回一個表達式,那麼沒有返回值的任何返回語句都應該明確聲明這是返回None,並且函數末尾應該有一個顯式的return語句(如果可以的話)。

是:

def foo(x): 
    if x >= 0: 
     return math.sqrt(x) 
    else: 
     return None 

def bar(x): 
    if x < 0: 
     return None 
    return math.sqrt(x) 

號:

def foo(x): 
    if x >= 0: 
     return math.sqrt(x) 

def bar(x): 
    if x < 0: 
     return 
    return math.sqrt(x)