函式的引數檢查
阿新 • • 發佈:2018-11-08
呼叫函式時,如果引數個數不對,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
錯誤和異常處理將在後續講到。