python - 理解位置参数的直观方法不应该跟在关键字参数之后

标签 python parameter-passing

如果你这样写代码:

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 编译器的一个限制,目的是减少对底层字典查找的需求。实际上并没有模棱两可的案例或他们正在避免的任何事情。

不过,您可以看到需要进行字典查找的位置:

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 字典中的 x(昂贵)。
  3. 放入x 参数。
  4. 阅读 5
  5. 检查 kwarg 字典是否有 y(昂贵)。
  6. 放入y 参数。

参数必须在前面:

  1. 阅读 10
  2. 放入x 参数。
  3. 阅读 5
  4. 放入y 参数。

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

PS:还有一种观点认为将关键字放在位置参数之前更难阅读,但我会将审美判断留给评论家。我认为它看起来不错。

关于python - 理解位置参数的直观方法不应该跟在关键字参数之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58279074/

相关文章:

c++ - 如何在不允许临时创建的情况下编写 const ref

python - pysvn 与 svn+ssh

python - boto3:无法使用 list_distributions 找到 CloudFront key

用于 Gauss-Seidel 迭代求解器的 Python 库?

c# - 按 ref 或按值 (C#) 传递方法参数的一般简短指南?

c# - 从同一个 "parent"类获取另一个嵌套类的类型

javascript - Ajax - 参数未传递 - 没有 jQuery

SQL/参数 : positional and (then) named?

python - 如何在Python中具有相同参数的X子方法中实例化类X?

python - 类必须是一个对象吗?它可以是一个 Action 吗?