2011-10-24 78 views
17

我在Pinax和其他Django應用程序中看到了一些代碼,而不是通過使用空的return語句。有什麼區別,它會對我正在運行的下面的django代碼有什麼影響?該代碼是一種信號方法,可自動將標籤標籤保存到tweet對象的taggit標籤對象中。在Python中,通過和返回之間的區別是什麼

我在這裏看到了一個關於在PHP中是否有返回語句在解釋字節碼中有所不同的問題,但我不確定它是否與Python相關。

import re 
TAG_REGEX = re.compile(r'#(?P<tag>\w+)') 

def get_tagged(sender, instance, **kwargs): 
    """ 
    Automatically add tags to a tweet object. 
    """ 
    if not instance: 
     return # will pass be better or worse here? 
    post = instance 
    tags_list = [smart_unicode(t).lower() for t in list(set(TAG_REGEX.findall(post.content)))] 
    if tags_list: 
     post.tags.add(*tags_list) 
     post.save() 
    else: 
     return # will a pass be better or worse here? 
post_save.connect(get_tagged, sender=Tweet) 
+0

例如,你不能定義一個沒有任何東西的函數/ ... stump。通過是一個noop/nullop –

回答

47
if not instance: 
    return # will pass be better or worse here? 

更糟。它改變了邏輯。 pass實際上是指:什麼也不做。如果在這裏將return替換爲pass,則控制流將繼續,從而改變代碼的語義。

pass的目的是創建空塊,否則使用Python的縮進方案是不可能的。例如,C中的空函數如下:

void foo() 
{ 
} 

在Python,這將是一個語法錯誤:

def foo(): 

這是pass來得心應手:

def foo(): 
    pass 
16

​​退出當前函數或方法。 Pass是一個空操作,並允許執行在下一個語句中繼續。

1
if not instance: 
    return # will pass be better or worse here? 

a pass將繼續執行該方法。 A return將終止該方法的執行。關於以下幾行,你想在這裏輸入return

else: 
    return # will a pass be better or worse here? 

這裏它沒有區別。即使刪除整個兩行也不會改變任何事情。

但無論如何,想象一下你會詳細闡述該方法。從一開始就選擇正確的流程會更好。

0

請參閱passreturn上的python文檔。在你現在的代碼中並沒有真正的區別(事實上,我將完全離開else)。

它們之間的區別主要在語義上:pass可用於需要語法的語句,但尚未(需要)語句。另一方面,return滿足某種功能的合同,提供了明確的結果。

+0

我在發佈之前閱讀了文檔,但並沒有真正理解這一點:「在生成器函數中,return語句不允許包含expression_list。在這種情況下,裸返回表示生成器完成並將導致StopIteration被提升。「現在很清楚它僅僅意味着「退出流程」;)謝謝! –

1

這不僅僅是一個答案的評論,但它不適合作爲評論。

if not instance: 
    return # will pass be better or worse here? 

正如在接受的答案中所解釋的,pass將是不正確的。

else: 
    return # will a pass be better or worse here? 

在這裏,因爲我們是在函數結束時,pass會做同樣的事情:沒有。更好的辦法是完全拋棄else條款,因爲沒有什麼可做的。 (的確,禪宗中的「明顯優於隱性」,但這很少適用於明確無所作爲 - 很清楚else案件會發生什麼,對於任何真正想到它的人來說都是如此。)

(也不清楚爲什麼你在函數內重命名instancepost - 你可以改變參數名稱?或者什麼sender參數應該是。哦,你實際上並不需要將set轉換爲一個list來遍歷列表理解:) :)

13

這說明了一些較早的答案。

def p(): 
    "Executes both blocks." 
    if 1: 
    print(1) 
    pass 
    if 1: 
    print(2) 
    pass 

def r(): 
    "Executes only the first block." 
    if 1: 
    print(1) 
    return 
    if 1: 
    print(2) 
    return 
+4

被接受的答案最能捕獲差異的「精神」,但這個答案在解釋功能差異方面做得很好。 :) –

相關問題