【问题标题】:An intuitive way to understand positional argument should not follow keyword argument理解位置参数的直观方法不应遵循关键字参数
【发布时间】:2019-10-08 01:27:43
【问题描述】:

如果你写这样的代码:

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

test(y=10,5,8)

这会引发错误:

SyntaxError: positional argument follows keyword argument

看来这是人人皆知的规律,但我还没有找到清晰直观的解释。

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

我想知道为什么我们不能这样做,是否有 ant 部分会混淆编译器?

如果能举个例子,那就太棒了!

【问题讨论】:

标签: python parameter-passing


【解决方案1】:

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

您可以看到需要在哪里进行 dict 查找:

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

test(y=10, 5)

从左上角到右下角跟随编译器...

允许 kwargs 出现在位置参数之前:

  1. 阅读y=10
  2. 放入kwargs dict(昂贵)。
  3. 阅读5。
  4. 检查第一个位置参数名称 x 是否在 kwargs 字典中(昂贵)。
  5. 放入x位置参数。

在位置参数之前不允许使用 wkargs:

  1. 阅读y=10
  2. 放入kwargs dict(昂贵)。
  3. 阅读5。
  4. 抛出和错误(容易吗?)

现在考虑使用普通参数的情况,这(可能)很快。

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

test(10, 5)

首先允许的关键字:

  1. 阅读10。
  2. 检查kwarg dict for x(昂贵)。
  3. 输入x arg。
  4. 阅读5。
  5. 检查kwarg dict for y(昂贵)。
  6. 输入y arg。

参数必须在前:

  1. 阅读10。
  2. 输入x arg。
  3. 阅读5。
  4. 输入y arg。

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

PS:还有一种观点认为将关键字放在位置参数之前更难阅读,但我会将审美判断留给批评者。我觉得挺好看的。

【讨论】:

    猜你喜欢
    • 2020-11-18
    • 2017-06-29
    • 1970-01-01
    • 2022-11-03
    • 2017-05-21
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多