Все обязательные параметры должны быть помещены перед аргументами по умолчанию. Просто потому, что они обязательны, а аргументы по умолчанию - нет. Синтаксически, для интерпретатора было бы невозможно решить, какие значения соответствуют каким аргументам, если разрешены смешанные режимы. 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
Где в этой функции используются аргументы по умолчанию, синтаксически правильные для приведенных выше вызовов функций. Вызов аргументов по ключевым словам оказывается полезным для обеспечения возможности позиционных аргументов не по порядку, но в сочетании с аргументами по умолчанию их также можно использовать для «пропуска» пропущенных аргументов.
def myfunction(position_arguments, *arguments, **keywords):`....`