如果你这样写代码:
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 出现在位置参数之前:
- 阅读
y=10
- 放入
kwargs
dict(昂贵)。 - 阅读
5
。 - 检查第一个位置参数名称
x
是否在kwargs
字典中(昂贵)。 - 放入
x
位置参数。
在位置参数之前不允许使用 wkargs:
- 阅读
y=10
- 放入
kwargs
dict(昂贵)。 - 阅读
5
。 - 抛出和错误(简单?)
现在考虑使用普通参数的情况,它(可以)很快。
def test(x, y):
return x + y
test(10, 5)
首先允许的关键字:
- 阅读
10
。 - 检查
kwarg
字典中的x
(昂贵)。 - 放入
x
参数。 - 阅读
5
。 - 检查
kwarg
字典是否有y
(昂贵)。 - 放入
y
参数。
参数必须在前面:
- 阅读
10
。 - 放入
x
参数。 - 阅读
5
。 - 放入
y
参数。
这个区别没有在 Python 中编译出来,因为字节码仍然允许动态函数调用。 Python 开发人员决定禁止关键字优先语法,以使该语言在运行时更快一些。
PS:还有一种观点认为将关键字放在位置参数之前更难阅读,但我会将审美判断留给评论家。我认为它看起来不错。
关于python - 理解位置参数的直观方法不应该跟在关键字参数之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58279074/