为什么在 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 中所做的。而且我相信这就是它在大多数面向对象语言中的完成方式。
我理解先传递位置参数然后传递关键字参数是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 中所做的。而且我相信这就是它在大多数面向对象语言中的完成方式。