Это ограничение компилятора Python, чтобы уменьшить необходимость поиска в словаре. Там на самом деле нет двусмысленного случая или чего-либо, чего они избегают.
Вы можете видеть, где должен произойти поиск dict:
def test(x, y):
return x + y
test(y=10, 5)
Следуйте компилятору сверху вниз слева-правильно ...
С кваргами, разрешенными до позиционных аргов:
- Читать
y=10
- Поместить в
kwargs
dict (дорого). - Чтение
5
. - Проверьте, находится ли имя первого позиционного аргумента
x
в kwargs
dict (дорогой). - Поместите в
x
позиционный аргумент.
Без wkargs, разрешенных до позиционных аргументов:
- Чтение
y=10
- Положить в
kwargs
dict (дорого). - Прочитайте
5
. - Бросок и ошибка (просто?)
Теперь рассмотрим случай, когда используются простые аргументы, которые (могут быть) быстрыми.
def test(x, y):
return x + y
test(10, 5)
Впервые разрешены ключевые слова:
- Чтение
10
. - Чек
kwarg
дикт для x
(дорого). - Положить
x
arg. - Чтение
5
. - Проверьте
kwarg
dict для y
(дорого). - Введите
y
arg.
Аргументы должны быть первыми:
- Чтение
10
. - Ввод
x
arg. - Чтение
5
. - Ввод
y
arg.
Это различие не компилируется в Python, потому что байт-код по-прежнему допускает динамические вызовы функций. Разработчики Python решили запретить синтаксис, основанный на ключевых словах, чтобы сделать язык немного быстрее во время выполнения.
PS: Существует также аргумент, что сложнее читать ключевые слова перед позиционными аргументами, но я оставлю эстетикусуждения критикам. Я думаю, что это выглядит хорошо.