1. 程式人生 > >函式的引數檢查

函式的引數檢查

呼叫函式時,如果引數個數不對,Python直譯器會自動檢查出來,並丟擲TypeError

>>> my_abs(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: my_abs() takes 1 positional argument but 2 were given

但是如果引數型別不對,Python直譯器就無法幫我們檢查。試試my_abs和內建函式abs的差別:

>>> my_abs('A')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in my_abs TypeError: unorderable types: str() >= int() >>> abs('A') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: bad operand type for abs(): 'str' 

當傳入了不恰當的引數時,內建函式abs會檢查出引數錯誤,而我們定義的my_abs沒有引數檢查,會導致if語句出錯,出錯資訊和abs不一樣。所以,這個函式定義不夠完善。

讓我們修改一下my_abs的定義,對引數型別做檢查,只允許整數和浮點數型別的引數。資料型別檢查可以用內建函式isinstance()實現:

def my_abs(x):
    if not isinstance(x, (int, float)): raise TypeError('bad operand type') if x >= 0: return x else: return -x 

添加了引數檢查後,如果傳入錯誤的引數型別,函式就可以丟擲一個錯誤:

>>> my_abs('A')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in my_abs TypeError: bad operand type 

錯誤和異常處理將在後續講到。