30.3.7. 使用关键字参数和位置参数设计参数列表

例如,计算两数相除的结果时,可能需要仔细考虑各种特殊情况。例如,在除数为0的情况下,是抛出ZeroDivisionError异常,还是返回无穷(infinity);

在结果溢出的情况下,是抛出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


result1 = safe_division(1.0, 10 ** 500, True, False)
print(result1)

result2 = safe_division(1.0, 0, False, True)
print(result2)

要想让代码看起来更清晰,一种办法是给这两个参数都指定默认值。按照默认值,该函数只要遇到特殊情况,就会抛出异常。

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

result1 = safe_division(1.0, 10 ** 500, ignore_overflow=True)
print(result1)

result2 = safe_division(1.0, 0, ignore_zero_division=True)
print(result2)

要点:

  • Keyword-only argument是一种只能通过关键字指定而不能通过位置指定的参数。这迫使调用者必须指明,这个值是传给哪一个参数的。

  • 在函数的参数列表中,这种参数位于符号的右侧。Positional-only argument是这样一种参数,它不允许调用者通过关键字来指定,而是要求必须按位置传递。这可以降低调用代码与参数名称之间的耦合程度。

  • 在函数的参数列表中,这些参数位于/符号的左侧。在参数列表中,位于/与之间的参数,可以按位置指定,也可以用关键字来指定。这也是Python普通参数的默认指定方式。