为什么在 Python 中需要在关键字参数之前指定位置参数?

Why positional arguments need to be specified before keyword arguments in Python?

我理解先传递位置参数然后传递关键字参数是python中的一个规则。

这就是为什么这些都是错误的:

def fun(x,y):
    print(x,y)
 
fun3(y=4,3)

SyntaxError: positional argument follows keyword argument

这也是错误的。

def fun2(**kwargs,*args):
  File "<stdin>", line 1
    def fun2(**kwargs,*args):
                     ^
SyntaxError: invalid syntax

Python 严格检查我是否首先传递位置参数。 什么我不明白。为什么?

是不是很直观:

def test(x,y,z):
    print(x,y,z)

然后将函数调用为

test(z=3,1,2)

应该先给关键字参数z赋值3,然后依次给剩余未赋值的变量x和y分别赋值1和2。

甚至 python 也没有检查变量是否已经赋值,因为下面给出了这样的错误:

def test2(x,y):
    print(x,y)
 
test2(1,x=1)
TypeError: test2() got multiple values for argument 'x'

获得了 x 的多个值。所以 python 肯定知道哪个变量已经收到了值。为什么它不能检查哪些变量没有收到值,然后按顺序为它们分配那些位置参数值。

我正在做笔记以供参考,但在写有关 python 这种行为背后的逻辑的任何内容时都卡住了。

Python 函数在定义时遵循参数的顺序,并在我们调用函数时以相同的顺序为它们赋值。做你想做的事情会像你在第二个问题中试图做的那样混淆它(TypeError: test2() got multiple values for argument 'x')。

当我们这样做时出现错误,它仍然更好,但如果将这样的功能添加到 python,可能会有更多错误(尤其是不会产生错误的错误)。例如,根据我们的逻辑,为一个错误的参数赋值。

看来你的论点是有道理的。

但我想指出当你说“这不是很直观吗:”

告诉我您在哪里看到过这个并且非常流行的任何其他面向对象语言。

所以python很受欢迎,因为它很容易适应,

我不了解你,但我最近从 C 切换到 python,在那里我习惯了

在 python 中创建函数,如长度、反向、排序等,最常见的名称出现在类似函数中。它很容易适应,不像其他语言,它们会更改名称或将这些功能隐藏在某些实用程序中 class,例如 java。

来回答你的问题。 就像其他人说的那样,它会增加复杂性。

这就是其他流行的面向对象语言没有采用它的原因。

因此,因为它没有其他流行语言的版本。

Python 没有采用它,因为它会使适应 python 变得困难。而且由于潜在的原因,它会使事情变得复杂。

“这不是很直观吗:”对我来说,礼貌地说,不,这不是很直观。

如果我在函数调用中的位置 0 传递参数,它会期望它转到函数定义中的位置 0 参数。因为这就是我在 C 中所做的。而且我相信这就是它在大多数面向对象语言中的完成方式。