写在前面:内容参照自《Effective Python》,其实你完全可以直接去看书,什么?你不想自己看书,那么你也可以关注我,我会不定期从书中挑出常用到的有效方法分享出来,这样你就可以一边刷头条,一边学习知识,岂不美哉。
正文
按关键字传递参数,是 Python 函数的一项强大特性(高质量python代码:用关键字参数来表达可选的行为)。由于关键字参数很灵活,所以在编写代码时,可以把函数的用法表达得更加明确。
例如,要计算两数相除的结果,同时要对计算时的特殊情况进行小心的处理。有时我们想忽略ZeroDivisionError 异常并返回无穷。有时又想忽略 OverflowError 异常并返回 0。
这个函数用起来很直观。下面这种调用方式,可以忽略除法过程中的 float 溢出,并返回 0。
下面这种调用方式,可以忽略拿 0 做除数的错误,并返回无穷。
该函数用了两个 Boolean 参数,来分别决定是否应该跳过除法计算过程中的异常,而问题就在于,调用者写代码的时候,很可能分不清这两个参数,从而导致难以排查的 bug。提升代码可读性的一种办法,是采用关键字参数。在默认情况下,该函数会非常小心地进行计算,并且总是会把计算过程中发生的异常重新抛出。
现在,调用者可以根据自己的具体需要,用关键字参数来覆盖 Boolean 标志的默认值,以便跳过相关的错误。
上面这种写法还是有缺陷。由于这些关键字参数都是可选的,所以没办法确保函数的调用者一定会使用关键字来明确指定这些参数的值。即便使用新定义的 safe_division_b 函数,也依然可以像原来那样,以位置参数的形式调用它。
对于这种复杂的函数来说,最好是能够保证调用者必须以清晰的调用代码,来阐明调用该函数的意图。在 Python3 中,可以定义一种只能以关键字形式来指定的参数,从而确保调用该函数的代码读起来会比较明确。这些参数必须以关键字的形式提供,而不能按位置提供。
下面定义的这个 safe_division_c 函数,带有两个只能以关键字形式来指定的参数。参数列表里的 * 号,标志着位置参数就此终结,之后的那些参数,都只能以关键字形式来指定。
现在,我们就不能用位置参数的形式来指定关键字参数了。
关键字参数依然可以用关键字的形式来指定,如果不指定,也依然会采用默认值。
要点
- 关键字参数能够使函数调用的意图更加明确。
- 对于各参数之间很容易混淆的函数,可以声明只能以关键字形式指定的参数,以确保调用者必须通过关键字来指定它们。对于接受多个 Boolean 标志的函数,更应该这样做。
- 在编写函数时,Python3 有明确的语法来定义这种只能以关键字形式指定的参数。