Python只能以关键字形式指定参数

Python 3 可以声明只能通过关键字来作为参数的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
def safe_division(number, divisor, *, ignore_overflow=False, ingore_zero_division=False):
try:
return number / divisor
except OverflowError:
if ignore_overflow:
return 0
else:
raise
except ZeroDivisionError:
if ingore_zero_division:
return float('int')
else:
raise

参数列表里的 * 号,标志着位置参数结束,之后的参数都只能以关键字形式来指定。

save_division(10, 0, False, True) # error

save_division(10, 0, ignore_zero_division=True) # ok


Python 2 中实现以关键字来指定的参数:

Python 2 并没有明确的语法来定义这种只能以关键字形式指定的参数。不过我们可以在参数列表中使用 ** 操作符,并且领函数遇到无效的调用时抛出TypeErrors,这样就可以实现与Python 3 相同的功能了。

为了使Python 2 版本的safe_division函数具备只能以关键字形式来指定的参数,我们可以先令该函数接受 **kwargs 参数,然后用 pop 方法把期望的关键字从 kwargs 字典里取走,如果字典的键里面没有那个关键字,那么 pop 方法的第二个参数就会成为默认值。最后为了防止调用者提供无效参数值,我们需要确认 kwargs 字典里面已经没有关键字参数了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Python 2
def safe_division(number, divisor, **kwargs):
ignore_overflow = kwargs.pop('ignore_overflow', False)
ingore_zero_division = kwargs.pop('ingore_zero_division', False)
if kwargs:
raise TypeError('Unexpected **kwargs: %r' % kwargs)
try:
return number / divisor
except OverflowError:
if ignore_overflow:
return 0
else:
raise
except ZeroDivisionError:
if ingore_zero_division:
return float('int')
else:
raise

safe_division(1, 0, False, False) # error

safe_division(0, 0, unexpected=True) # error

save_division(10, 0, ignore_zero_division=True) # ok