2013-06-05 2 views
62

Почему этот кусок кода выдает 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 
... 
+0

в питоне, который, как структура, когда вы определяете функцию 'Защита MYFUNCTION (position_arguments, * аргументы ** ключевых слов):' ' ....' – abhishekgarg

ответ

72

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

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

+0

Синтаксически невозможно, чтобы интерпретатор решил, какие значения соответствуют тем аргументам, если допустимы смешанные режимы. Ruby позволяет использовать аргументы, отличные от параметров по умолчанию, по умолчанию. Как вы предложите назначение переменных в вызове функции Просто используйте 'func1 (x = 1, y = 2)'. – weakish

+0

Привет @weakish, спасибо за комментарий, у Python есть хороший способ достичь этого, пожалуйста, ищите поиск * args и ** kwargs –

+0

Привет @Rahul Gautam Я в замешательстве. Я думал, что '** kwargs' не может сделать' def fun1 (a = "who is you", b = "True", x, y) 'или подобная работа. Если вы используете 'def f (** kwargs)', вам нужно обрабатывать значения по умолчанию в теле? – weakish

0

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

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

Что бы это сделать в первом примере? В последнем x - «кто есть кто», y - 3 и a = «jack».

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

+0

ключевого слово только аргументы аккуратной особенность Python 3. Слишком плохо, что патч для резервного копирования на Python 2.6 и 2.7 был просто [оставлен до конца] (http://bugs.python.org/issue1745). –

3

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

  • во-первых, не по умолчанию аргумент не должен следовать аргумент по умолчанию, это означает, что вы не можете определить (а = Ь, с) в функции, порядок определения параметра в функция являются:
    • Позиционный параметр или не по умолчанию то есть параметр (а, б, в)
    • параметр ключевого слова или параметр по умолчанию т.е. (а = «Ъ», г = «J»)
    • и по ключевым словам только параметр ie (* args)
    • вар-ключевое слово параметр т.е. (** kwargs)

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

(а, б) Позиционный параметр

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

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

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

(* ае) является ключевым словом только

(** аб) является вар-ключевое слово параметр

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

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

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

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

0

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

Смежные вопросы