2013-05-14 71 views
0

哪種編碼風格是更好/正確爲什麼? 藉助各功能斷言聲明:檢查是否函數調用正確的參數

def fun_bottom(arg): 
    assert isinstance(arg, int) 
    #blah blah 

def fun_middle(arg): 
    assert isinstance(arg, int) 
    fun_bottom(arg) 
    #blah blah 

def fun_top(arg): 
    assert isinstance(arg, int) 
    fun_middle(arg) 
    #blah blah 

或者,因爲我們知道,arg的類型是fun_bottom功能檢查,只是省略fun_middle和fun_top斷言?或者也許有另一種解決方案?

編輯#1
哎喲,我被誤解了。我只是以assert isinstance(arg,int)爲例。我重寫了一個問題:

使用哪一個:

選項1: 檢查參數實現每個函數功能的要求:

def fun_bottom(arg): 
    assert arg > 0 
    #blah blah 

def fun_middle(arg): 
    assert arg > 0 
    fun_bottom(arg) 
    #blah blah 

def fun_top(arg): 
    assert arg > 0 
    fun_middle(arg) 
    #blah blah 

選項2:因爲我們知道這樣的說法是在最底層的功能被檢查,我們不主張在中等及頂級功能:

def fun_bottom(arg): 
    assert arg > 0 
    #blah blah 

def fun_middle(arg): 
    fun_bottom(arg) 
    #blah blah 

def fun_top(arg): 
    fun_middle(arg) 
    #blah blah 
+3

不要在任何地方聲明類型。學習愛鴨子打字,並依靠您期望定義的方法。 – agf

+0

爲什麼你認爲你需要堅持這一點?如果您想編寫只接受已聲明參數類型的函數,請使用靜態類型語言(如Java)。否則,按照寫入Python的方式編寫Python。 –

+0

你需要使用鴨子打字。在「try/except」中標準化輸入,然後做任何你需要的操作。 –

回答

2

我建議DOI更Python的方式NG事情會我更喜歡:

def fun_fun(some_int): # function that takes hopefully an int/float 
    try: # not sure if we got the correct value 
     return_value = some_int + 4 % 4 # mathz 
     return return_value # return mathz 
    except TypeError: # if we didn't get an int/float we'd get this 
     return None # So you can return None or do what you like 

參見:http://docs.python.org/2/tutorial/errors.html

編輯:

也許你想:

def fun_bottom(arg): 
    if arg > 0: 
     #blah blah 
    else: 
     #foo 

斷言不應該在莊園中使用您的想要它,請閱讀: http://wiki.python.org/moin/UsingAssertionsEffectively

相關問題