在Python中,*args和**kwargs的用法对我来说很清楚,SO上有很多相关问题(例如Use of *args and **kwargs和What does ** (double star/asterisk) and * (star/asterisk) do for parameters?)。
但是我想了解的一件事是:为什么不能同时定义强制位置参数,强制关键字参数,并最终允许像下面的一样捕获其他args和kwargs?
但是我想了解的一件事是:为什么不能同时定义强制位置参数,强制关键字参数,并最终允许像下面的一样捕获其他args和kwargs?
def one_kwarg_is_mandatory(*, b, **kwargs):
print(b)
for key, value in kwargs.items():
print(key, value)
def one_pos_arg_and_one_kwarg_are_mandatory(a, *, b, **kwargs):
print(a, b)
for key, value in kwargs.items():
print(key, value)
# I wanted a mandatory arg (a) and possibly parse other args (*args),
# then a mandatory kwarg (b) and eventually other kwargs (**kwargs)
def cant_do_that(a, *args, *, b, **kwargs):
print(a, b)
print(args)
for key, value in kwargs.items():
print(key, value)
# not really interested on this because "b" must be a kwarg and hiding
# it under **kwargs would not be explicit enough for my customer (sometimes myself ;))
def could_do_this_but(a, b, *args, **kwargs):
print(a, b)
print(args)
print(kwargs)
可以在 could_do_this_but
函数的签名中省略 b
,并在函数顶部执行(例如)kwargs.get("b", None)
,如果找到 None
,则引发适当的错误...但是将 "b" 直接放在函数签名中将允许更快、更明确的代码开发,以便在将来调用该函数时使用。