每日10行代码118: 编写高质量python代码的方法21:用只能以关键字形式指定的参数来确保代码明晰

按关键字传递参数,是python函数的一项强大特性,参见:(https://blog.csdn.net/weixin_44981444/article/details/113738138
由于关键字参数很灵活,所以在编写代码时,可以把函数的用法表达得更加明确。
例如,要计算两数相除的结果,同时 要对计算时的特殊情况进行小心的处理。有时我们想忽略 ZeroDivisionError异常并返回无穷。有时又想忽略 OverflowError异常并返回0.

def safe_division(number, divisor, ignore_overflow, ignore_zero_division):
    try:
        return number/divisor
    except OverflowError:
        if ignore_overflow:
            return 0
        else:
            raise
    except ZeroDivisionError:
        if ignore_zero_division:
            return float('inf')
        else:
            raise

这个函数用起来很直观。下面这种调用方式,可以忽略除法过程 中的float溢出,并返回0.

result = safe_division(1.0, 10**500, True, False)
print(result)
>>>
0

下面这种调用方式 ,可以忽略拿0做除数的错误,并返回无穷。

result = safe_division(1.0, 0, False ,True)
print(result)
>>>
inf

该函数用了两个boolean参数,来分别决定是否应该跳过除法计算过程中的异常,而问题就在于,调用者写代码的时候,很可能分不表这两个参数,从而导致难以排查 的bug。提升代码可读性的一种办法 ,是采用关键字参数。在默认情况下,该 函数 会非常小心地进行计算,并且总会把计算过程 中发生的异常抛出。

def safe_division_b(number,divisor,ignore_overflow=False, ignore_zero_division=False):
    # ........

现在,调用的人可以根据自己的需要,用关键字参数来覆盖boolean标志的默认值,以便跳过相关错误。

safe_division_b(1.0, 10**500, True, False)
safe_division_b(1.0, 0, False ,True)

但是上面这种写法还是有缺陷。因为关键字参数是可选的,调用都不一定指定使用关键字参数来明确指定这些参数的值。即便使用的是新定义的safe_division_b函数,也依然可以像原来那样,以位置参数的形式调用它。

safe_division_b(1.0, 10**500, True, False)

对于这种复杂的函数来说,最好能保证调用者必须以清晰的调用代码,来阐明调用该函数的意图。在python3中,可以定义 一种只能以关键字形式来指定的参数,从而确保调用该函数的代码读起来会比较明确。这些参数必须以关键字的形式来提供,而不能按位置提供。
下面定义的这个safe_division_c函数,带有两个只能以关键字形式来指定的参数。参数列表里的*号,标志着位置参数就此终结,之后的那些参数,都只能以关键字形式来指定。

def safe_division_c(number,divisor,*,ignore_overflow=False, ignore_zero_division=False):
    # ........

现在我们不能用位置参数的形式来指定关键字参数了。

safe_division_c(1.0, 0, False ,True)
>>>
TypeError: safe_division_c() takes 2 positional arguments but 4 were given

关键字参数依然可以用关键字的形式来指定,如果不指定,也依然会采用默认值。

safe_division_c(1.0, 0, ignore_zero_division=True)

注意,这种方法在python2中没有方法实现此功能,因为python2没有明确的语法来定义这种只能以关键字形式指定的参数。书中介绍了在python2中的变通实现方法,这里我就不写了。

要点:

  1. 关键字参数能使函数调用的意图更加明确。
  2. 对于各参数之间很容易混淆的函数,可以声明只能以关键字形式指定的参数,以确保调用者必须通过关键字来指定它们。对于接受多个Boolean标志的函数,更应该这样做。
  3. 在编写函数时,python3可以在参数列中中加入星号来约束星号以后的参数只能以关键字的形式指定。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值