Подтвердить что ты не робот

Почему аргументы за пределами аргумента не могут следовать аргументу по умолчанию?

Почему эта часть кода генерирует ошибку синтаксиса?

  >>> def fun1(a="who is you", b="True", x, y):
...     print a,b,x,y
... 
  File "<stdin>", line 1
SyntaxError: non-default argument follows default argument

При правильном выполнении кода кода...

>>> def fun1(x, y, a="who is you", b="True"):
...     print a,b,x,y
... 

Я изучаю программирование, будьте терпеливы со мной....

4b9b3361

Ответ 1

Все обязательные параметры должны быть помещены перед любыми аргументами по умолчанию. Просто потому, что они являются обязательными, тогда как аргументы по умолчанию - нет. Синтаксически интерпретатору было бы невозможно решить, какие значения соответствуют тем аргументам, если допустимы смешанные режимы. A SyntaxError возникает, если аргументы не указаны в правильном порядке:

Давайте рассмотрим аргументы ключевого слова, используя вашу функцию.

def fun1(a="who is you", b="True", x, y):
...     print a,b,x,y

Предположим, что разрешено объявлять функцию, как указано выше, Затем с помощью вышеуказанных объявлений мы можем сделать следующие (регулярные) позиционные или ключевые аргументы:

func1("ok a", "ok b", 1)  # Is 1 assigned to x or ?
func1(1)                  # Is 1 assigned to a or ?
func1(1, 2)               # ?

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

>>> def fun1(x, y, a="who is you", b="True"):
...     print a,b,x,y
... 

Ссылка O'Reilly - Core-Python
                                                             Где, когда эта функция использует аргументы по умолчанию, синтаксически правильные для вышеперечисленных вызовов функций. Вызовы аргументов ключевого слова оказываются полезными для того, чтобы быть в состоянии предусмотреть позиционные аргументы вне порядка, но в сочетании с аргументами по умолчанию они также могут использоваться для "пропускания" отсутствующих аргументов.

Ответ 2

SyntaxError: non-default argument follows default argument

Если вы допустили это, аргументы по умолчанию были бы бесполезны, потому что вы никогда не сможете использовать их значения по умолчанию, поскольку аргументы, отличные от значения по умолчанию, приходят после.

Однако в Python 3 вы можете сделать следующее:

def fun1(a="who is you", b="True", *, x, y):
    pass

который делает ключевое слово x и y, поэтому вы можете сделать это:

fun1(x=2, y=2)

Это работает, потому что больше нет никакой двусмысленности. Обратите внимание, что вы по-прежнему не можете выполнить fun1(2, 2) (который будет устанавливать аргументы по умолчанию).

Ответ 3

Позвольте мне высказать здесь два момента:

  • во-первых, аргумент не по умолчанию не должен следовать аргументу по умолчанию, это означает, что вы не можете определить (a = b, c) в функции порядок определения параметра в функции:
    • позиционный параметр или параметр не по умолчанию i.e(a, b, c)
    • параметр ключевого слова или параметр по умолчанию i.e(a = "b", r = "j" )
    • параметр только для ключевого слова i.e(* args)
    • параметр var-keyword i.e(** kwargs)

def example(a, b, c=None, r="w" , d=[], *ae, **ab):

(a, b) являются позиционным параметром

(c = none) является необязательным параметром

(r = "w" ) - параметр ключевого слова

(d = []) - параметр списка

(* ae) - это ключевое слово

(** ab) - параметр var-keyword

  • теперь вторично, если я попробую что-то вроде этого: def example(a, b, c=a,d=b):
Аргумент

не определяется, когда значения по умолчанию сохраняются, Python вычисляет и сохраняет значения по умолчанию, когда вы определяете функцию

c и d не определены, не существует, когда это происходит (оно существует только при выполнении функции)

"a, a = b" его не разрешено в параметре.

Ответ 4

Обязательные аргументы (те, которые не установлены по умолчанию) должны быть в начале, чтобы клиентский код мог предоставить только два. Если бы факультативные аргументы были в начале, это сбивало бы с толку:

fun1("who is who", 3, "jack")

Что это будет в первом примере? В последнем случае x является "кто есть кто", y равно 3 и a = "jack".

Ответ 5

было решено рабочим маханизмом парсера аргументов python. Ничего волшебного здесь.