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


почему этот кусок кода бросает SyntaxError?

  >>> 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
... 
5 77

5 ответов:

все необходимые параметры должны быть помещены перед любыми аргументами по умолчанию. Просто потому, что они обязательны, а аргументы по умолчанию-нет. Синтаксически это было бы невозможно для интерпретатора, чтобы решить, какие значения соответствуют какие аргументы, если смешанные режимы были разрешены. А 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
Где в качестве этой функции используют аргументы по умолчанию синтаксически корректны для приведенных выше вызовов функций. Вызов аргументов ключевого слова оказывается полезным для обеспечения неупорядоченных позиционных аргументов, но в сочетании с аргументами по умолчанию они также могут использоваться для "пропуска" отсутствующих аргументов.

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) (что установил бы аргументы по умолчанию).

позвольте мне прояснить два момента :

  • во-первых, аргумент не по умолчанию не должен следовать за аргументом по умолчанию , это означает, что вы не можете определить (A=b,c) в функции порядок определения параметра в функции :
    • позиционных параметров или нестандартный параметр.Е (А,B,с)
    • параметр ключевого слова или параметр по умолчанию, т. е. (a= "b", r="j")
    • параметр только для ключевых слов, т. е. (*args)
    • var-ключевое слово параметр 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" его не допускается в параметре.

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

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

что бы это сделать в вашем первом примере? В последнем случае x - это "кто есть кто", y-3 и a = "Джек".

было принято рабочей механизм парсер аргументов в Python. Здесь нет ничего волшебного.