2011-04-10 148 views
2

我該怎麼做? 我這樣做?Python返回值?

def aFunction(argument): 
    def testSomething(): 
     if thisValue == 'whatItShouldBe': 
      return True 
     else: 
      return False 

    if argument == 'theRightValue': # this is actually a switch using elif's in my code 
     testSomething() 
    else: 
     return False 

def aModuleEntryPoint(): 
    if aFunction(theRightValue) == True: 
     doMoreStuff() 
    else: 
     complain() 

aModuleEntryPoint() 

aModuleEntryPoint()在開始做事之前需要先確定一個條件是真的。由於封裝,aModuleEntryPoint不知道如何檢查條件,但aFunction()有一個名爲testSomething()的子功能,它知道如何檢查條件。 aModuleEntryPoint()來電aFunction(theRightValue)

因爲theRightValue作爲參數傳遞給aFunction(),所以aFunction()調用testSomething()testSomething()執行邏輯測試,並返回TrueFalse

我需要aModuleEntryPoint()知道什麼testSomething()決定。我不想aModuleEntryPoint()知道如何testSomething()得出結論。

這實際上是一個成就,發佈我的實際來源,同時刪除其他功能和什麼,所以我不得不這樣設置一般的要點。

+0

謝謝@Eimantas,這會讓我的頭部受傷更少:) – 2011-04-10 06:07:49

回答

4

我看錯現在唯一的事情是你需要testSomething()return上線9

+0

否則aFunction()將在此時返回None。 – 2011-04-10 06:12:54

+0

爲什麼評論你自己的答案,而不是編輯它? – 2011-04-10 06:16:14

+0

注意力不集中。我試圖編輯,然後忘了功能的名稱:^ \ – 2011-04-10 06:18:13

0

也許一個子功能是不正確的封裝工具,您可以在這裏。您想要將內部功能公開給外部實體。 Python類提供了一種比子函數更好的表達機制。擁有一個類,你可以以一種非常可控的方式暴露你想要的內部功能的任何部分。

+0

謝謝!當我沒有受到這樣的時間限制時,我會在路上稍微旋轉一下。 – brad 2011-04-10 14:50:38

0

我的第一個想法是看看你的代碼,它有點太複雜了。爲什麼要有aFunction?你可以只寫

def aModuleEntryPoint(): 
    argument = ... 
    if argument in (theRightValue, theOtherRightValue, theOtherOtherRightValue)\ 
     and testSomething(): 
     doMoreStuff() 
    else: 
     complain() 

if子句將首先檢查argument是否是可能的正確的價值觀之一,如果是,那麼它會繼續調用testSomething()並檢查返回值。只有當返回值爲真時,纔會調用doMoreStuff()。如果其中任何一個測試失敗(這就是爲什麼我使用and),它會complain()

+0

就像我在文章中提到的那樣,由於數據封裝,aFunction()知道如何做別人不做的事情。在現實生活中,aFunction()被稱爲control()。它的目的是控制與sql的連接。 testSomething()被稱爲checkConnection(),並且在程序的用戶經歷輸入數據的麻煩之前驗證到數據庫的良好鏈接,僅僅被告知鏈接失敗。 – brad 2011-04-10 14:47:33

+0

@brad:好吧,從你的問題來看,並不清楚「aFunction」是否包含足夠的代碼來證明自己的功能是正確的。 – 2011-04-10 20:56:56