0

我理解首先传递位置参数然后传递关键字参数是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,然后依次将 1 和 2 分别分配给其余未分配的变量x 和 y。

甚至python不检查变量是否已经分配,​​因为以下给出了如下错误:

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

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

我正在做笔记以供参考,我在写任何关于python这种行为背后的逻辑的东西时都被卡住了。

4

2 回答 2

0

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

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

于 2021-02-14T10:22:03.817 回答
0

看看你的论点似乎是有效的。

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

告诉我你见过的任何其他面向对象的语言,并且非常流行。

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

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

在 python 中创建长度、反向、排序等函数,类似函数的确切最常用名称。它很容易适应,不像其他语言,它们更改名称或将这些函数隐藏在一些 utils 类中,如 java。

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

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

因此,由于它在其他流行语言中不可用。

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

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

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

于 2021-02-16T07:01:17.477 回答