为什么在 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,z)

然后调用函数

test(z=3,1,2)

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

甚至不是python不检查变量是否已经赋值,因为下面给出了一个错误

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

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

我正在做笔记以供参考,但在编写有关 Python 行为背后的逻辑的任何内容时遇到困难。

解决方法

Python 函数在定义时遵循参数的顺序,并在调用函数时以相同的顺序为它们赋值。做你想做的事会像你在第二个问题 (405 Not Allowed) 中尝试做的那样混淆它。

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

,

看来你的论点是有效的。

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

请告诉我您在哪些地方见过这种并且非常流行的其他面向对象语言。

所以python之所以流行,是因为它很容易适应,

我不了解你,但我最近从 C 语言切换到了 python,而且我习惯于

在python中创建诸如长度、反向、排序等函数,类似函数的最常见名称存在。它非常容易适应,不像其他语言那样更改名称或将这些函数隐藏在某些 utils 类(如 java)中。

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

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

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

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

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

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