参数检查

    调用函数时,如果参数个数不对,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

    错误和异常处理将在后续讲到。