结合来自:https://blog.csdn.net/u012005313/article/details/48049327
前言:参数检查
调用函数时,如果参数个数不对,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
数据类型检查可以使用内置函数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')
isinstance(object, class-or-type-or-tuple) ->bool
内置函数isinstance有两个参数,第一个参数是待检测的对象,第二个参数是对象类型,可以是单个类型,也可以是元组,返回的bool类型
如果待检测对象属于第二个参数,则返回True;否则,返回False