为什么 args 和仅关键字参数不能同时与 *args 和 **kwargs 混合

dep*_*ovo 9 python args keyword-argument python-3.x

python 中 *args 和 **kwargs 的用法对我来说很清楚,并且 SO 中存在很多问题(例如*args 和 **kwargs 的使用以及**(双星/星号)和 *(星号/星号)对参数做什么?)。

但我想理解的一件事是:为什么不能同时定义强制位置参数、强制 kwarg 参数并最终仍然允许捕获其他参数和 kwargs,如下所示cant_do_that

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)
Run Code Online (Sandbox Code Playgroud)

是的,人们可以摆脱b函数的签名,在函数顶部could_do_this_but执行(例如) a并在发现时引发一些适当的错误......但是直接在函数签名上使用“b”将允许更快、更明确的代码未来将使用该功能进行开发。kwargs.get("b", None)None

Mis*_*agi 10

正确的语法是def cant_do_that(a, *args, b, **kwargs):. 请注意,*仅使用一次,既用于标记位置参数的结束,又用于标记位置参数的结束。用于设置可变位置参数的名称。

\n
\n

函数定义中的the*语法上是唯一的位于位置或关键字参数与仅关键字参数之间的分隔处,在语法上是

\n
parameter_list_starargs   ::=  "*" [parameter] ("," defparameter)* ["," ["**" parameter [","]]]\n                               | "**" parameter [","]\n
Run Code Online (Sandbox Code Playgroud)\n

简而言之,语法"*" [parameter]含义**args语法上是相同的东西 \xe2\x80\x93 一个文字*和可选名称 \xe2\x80\x93 可能只出现一次。使用 bare*来启动仅关键字参数,而不采用可变位置参数,并使用命名*args来启动仅关键字参数采用可变位置参数。

\n
\n

如果存在 \xe2\x80\x9c \xe2\x80\x9d 形式*identifier,则将其初始化为接收任何多余位置参数的元组,默认为空元组。[...] \xe2\x80\x9c *\xe2\x80\x9d 或 \xe2\x80\x9c之后的参数*identifier \xe2\x80\x9d 之后的参数仅是关键字参数,只能传递使用的关键字参数。

\n
\n