Почему этот кусок кода генерирует ошибку 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
...
def myfunction(position_arguments, *arguments, **keywords):
`....`Ответы:
Все обязательные параметры должны быть помещены перед аргументами по умолчанию. Просто потому, что они обязательны, а аргументы по умолчанию - нет. Синтаксически, для интерпретатора было бы невозможно решить, какие значения соответствуют каким аргументам, если разрешены смешанные режимы. A
SyntaxError
вызывается, если аргументы указаны не в правильном порядке:Давайте посмотрим на ключевые аргументы, используя вашу функцию.
Предположим, что разрешено объявлять функцию, как указано выше. Затем с помощью описанных выше объявлений мы можем сделать следующие (обычные) позиционные вызовы или вызовы аргументов с ключевыми словами:
Как вы будете предлагать присваивание переменных в вызове функции, как будут использоваться аргументы по умолчанию вместе с аргументами ключевых слов.
Ссылка O'Reilly - Core-Python
Где в этой функции используются аргументы по умолчанию, синтаксически правильные для приведенных выше вызовов функций. Вызов аргументов по ключевым словам оказывается полезным для обеспечения возможности позиционных аргументов не по порядку, но в сочетании с аргументами по умолчанию их также можно использовать для «пропуска» пропущенных аргументов.
источник
func1(x=1, y=2)
.**kwargs
не может сделатьdef fun1(a="who is you", b="True", x, y)
или подобную работу. Если вы используетеdef f(**kwargs)
, вам нужно обрабатывать значения по умолчанию в теле?def fun1(a="who is you", b="True", x, y)
то же самое можно достичь с другим стилем. если def fun1 (** kwrgs) `, то вызыватьfun1({'a': 'who is you', 'b': True})
нет необходимости передавать x и y.def foo(x=None, y)
бы это было разрешено. Поэтому мне все еще интересно, почему это не разрешено Python. Есть ли настоящая фундаментальная причина или это просто «мы не разрешаем это, потому что мы не разрешаем это».Если бы вы позволили это, аргументы по умолчанию были бы бесполезны, потому что вы никогда не сможете использовать их значения по умолчанию, поскольку аргументы не по умолчанию идут после .
В Python 3, однако, вы можете сделать следующее:
который делает
x
иy
только ключевое слово, так что вы можете сделать это:Это работает, потому что больше нет двусмысленности. Обратите внимание, что вы все еще не можете сделать
fun1(2, 2)
(это установит аргументы по умолчанию).источник
Позвольте мне прояснить два момента здесь:
def example(a, b, c=None, r="w" , d=[], *ae, **ab):
(а, б) - позиционный параметр
(c = none) является необязательным параметром
(r = "w") является ключевым параметром
(d = []) является параметром списка
(* ae) только для ключевых слов
(** ab) - параметр ключевого слова var
def example(a, b, c=a,d=b):
аргумент не определен при сохранении значений по умолчанию, Python вычисляет и сохраняет значения по умолчанию при определении функции
c и d не определены, не существует, когда это происходит (существует только при выполнении функции)
"a, a = b" не допускается в параметре.
источник
Обязательные аргументы (без значений по умолчанию) должны быть в начале, чтобы клиентский код мог указывать только два. Если бы необязательные аргументы были в начале, это могло бы сбить с толку:
Что бы это сделать в вашем первом примере? В последнем случае x - это «кто есть кто», y равно 3 и a = «валет».
источник