一种理解位置参数的直观方法不应遵循关键字参数

问题描述 投票:2回答:1

如果您编写类似的代码:

def test(x,y,z):
    return x+y

test(y=10,5,8)

会引发错误:

SyntaxError: positional argument follows keyword argument

所以似乎这是每个人都知道的规则,但是,我还没有找到关于此的清晰直观的解释。

我认为y是关键字参数,然后遵循参数的顺序,所以x为5,z为8。

我想知道为什么我们不能这样做的原因,是否有一个蚂蚁的部分会混淆编译器?

如果可以显示一个示例,那将非常棒!

python parameter-passing
1个回答
1
投票

这是Python编译器的一项限制,目的是减少对幕后字典查找的需求。实际上并没有模棱两可的情况或他们要避免的任何事情。

尽管您可以看到字典查找需要在哪里进行:

def test(x, y):
    return x + y

test(y=10, 5)

按照从左上方到右下方的顺序进行编译...

允许kwargs出现在位置args之前:

  1. 读取y=10
  2. 放入kwargs字典(昂贵)。>>
  3. 读取5
  4. 检查第一个位置参数名称x是否在kwargs dict中(昂贵)。
  5. 放入x位置参数。>>
  6. [在位置参数之前不允许wkargs:

    1. 读取y=10
  7. 放入kwargs字典(昂贵)。>>
  8. 读取5
  9. 抛出和出错(容易吗?)
  10. 现在考虑使用普通参数的情况,这种情况(可能)很快。

    def test(x, y):
        return x + y
    
    test(10, 5)
    

    首先允许使用关键字:

  1. 读取10
  2. 检查kwarg格是否为x(昂贵)。>>
  3. 放入x arg。
  4. 读取5
  5. 检查kwarg格是否为y(昂贵)。>>
  6. 放入y arg。
  7. Args必须在第一位:

    1. 读取10
    2. 放入x arg。
    3. 读取5
    4. 放入y arg。

    这种差异不会在Python中编译出来,因为字节代码仍然允许动态函数调用。 Python开发人员决定禁止关键字优先语法,以使该语言在运行时更快。

    PS:还有一个论点是,很难将关键字放在位置args之前,但是我将把美学判断留给批评家。我认为看起来不错。

© www.soinside.com 2019 - 2024. All rights reserved.