2012-02-05 199 views
3

函數calculate_attribute不返回值;它只能通過副作用起作用。在調用另一個函數後立即返回函數

通常該函數中我不得不寫這幾行:

print('some message') 
set_attribute(value) 
return 

所以我決定把這個變成一個不同的功能:

def report_and_set(value, message): 
    print(message) 
    set_attribute(value) 

它是確定到現在做到以下幾點:

def calculate_attribute(params): 
    #... 
    if something: 
     return report_and_set(value, message) 
    #... 
    if another_condition: 
     return report_and_set(value, message) 
    #...  

感覺有點奇怪寫這個,因爲report_and_set沒有返回值。但是如果我不這樣做,我必須在每次撥打report_and_set後重復輸入return

+0

從技術上講,它確實有一個返回值。如果沒有返回語句,函數默認返回None。如何使用elif語句?然後你可以調用report_and_set()而不用擔心使用return來退出函數。 – 2012-02-05 06:00:27

+0

它可能是*重構時間*,但很難說不知道你的功能是什麼。 – 2012-02-05 10:42:46

回答

1

許多程序員,包括我自己,prefer a single return per function

偶爾,我可能會在函數的前幾行插入return,以便在某些健全檢查失敗時保釋。

我不會在這種情況下。

在這種情況下,我只想做...

def calculate_attribute(params): 
    #... 
    if something: 
     report_and_set(value, message) 
    #... 
    elif another_condition: 
     report_and_set(value, message) 
    #...  

還要考慮Single Responsibility Principle(它同樣適用於函數和類)。如果你的函數很長並且包含大量的條件函數調用,那麼可能是refactor的時間!

+1

我認爲單一入場單出口不同於「單回單」,這看起來相當嚴格,並且有時很繁重。 [第二個回答](http://programmers.stackexchange.com/a/118793)對你所關聯的問題表明「僅一次回報」是基於對SESE的誤解。儘管如此,我同意一般情況下,計算「回報」陳述是衡量函數複雜性的一個粗略的啓發式;更多的回報=更多[圈複雜度](http://en.wikipedia.org/wiki/Cyclomatic_complexity)。 – senderle 2012-02-05 15:25:09

+1

@senderle:+1一個非常有趣的見解和鏈接。 – max 2012-02-08 18:00:00

0

是的,可以這樣做。

不,沒有錯。

繼續。

2

那麼,你必須每次輸入return。我不知道你收穫了什麼(或損失)做它,你建議的方式,特別是因爲

return 

有效地同

return None 

但我不知道爲什麼你有這些空返聲明在函數中。有必要嗎?在這個函數中可能有一個更優雅或更易於閱讀的方式來處理控制流。一個函數中間的隨機return可能很容易錯過。

更抽象地說,計算返回語句是衡量函數複雜度的一個很好的粗略啓發式;大多數時候,更多的回報意味着更多cyclomatic complexity。根據經常引用的「單次進入,單次退出」的原則,甚至有一派思想堅持在任何給定的功能中只使用return一次。事實上,我認爲「單一入場,單次出境」與「一次迴歸」不同,對我來說這似乎相當嚴格,有時也很繁瑣。 (更多信息,請參閱this post,這表明「僅返回一次」是基於對SESE的誤解)。但總體原則是,更少的陳述對我來說似乎是一個很好的陳述。

+0

哎呀,是的,我應該澄清,我只保存一個新的路線;當然,我仍然需要輸入'return'。你也可以將你的評論移到你的答案,因爲它非常有用? – max 2012-02-08 17:58:30

+0

@max,很高興你覺得它有用!我將它合併到我的答案中。 – senderle 2012-02-08 23:39:09

相關問題