Интуитивно понятный способ понять позиционный аргумент не должен следовать за ключевым аргументом - PullRequest
2 голосов
/ 08 октября 2019

если вы напишите код вроде:

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

test(y=10,5,8)

Это вызовет ошибку:

SyntaxError: positional argument follows keyword argument

Так что, кажется, это правило, которое все знают, однако я не знаюЯ нашел ясные и интуитивно понятные объяснения по этому поводу.

Я думаю, что y является аргументом ключевого слова, а затем следует порядку аргументов, поэтому x будет равно 5, а z равно 8.

Интересно, почему мы не можем этого сделать, есть ли муравейная часть, которая может сбить с толку компилятор?

Если показать пример, это было бы действительно здорово!

1 Ответ

1 голос
/ 08 октября 2019

Это ограничение компилятора Python, чтобы уменьшить необходимость поиска в словаре. Там на самом деле нет двусмысленного случая или чего-либо, чего они избегают.

Вы можете видеть, где должен произойти поиск dict:

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

test(y=10, 5)

Следуйте компилятору сверху вниз слева-правильно ...

С кваргами, разрешенными до позиционных аргов:

  1. Читать y=10
  2. Поместить в kwargs dict (дорого).
  3. Чтение 5.
  4. Проверьте, находится ли имя первого позиционного аргумента x в kwargs dict (дорогой).
  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 arg.
  4. Чтение 5.
  5. Проверьте kwarg dict для y (дорого).
  6. Введите y arg.

Аргументы должны быть первыми:

  1. Чтение 10.
  2. Ввод x arg.
  3. Чтение 5.
  4. Ввод y arg.

Это различие не компилируется в Python, потому что байт-код по-прежнему допускает динамические вызовы функций. Разработчики Python решили запретить синтаксис, основанный на ключевых словах, чтобы сделать язык немного быстрее во время выполнения.

PS: Существует также аргумент, что сложнее читать ключевые слова перед позиционными аргументами, но я оставлю эстетикусуждения критикам. Я думаю, что это выглядит хорошо.

...