Это соответствующий бит из грамматики :
arglist: (argument ',')* (argument [',']
|'*' test (',' argument)* [',' '**' test]
|'**' test)
Первая строка здесь позволяет ставить запятую после последнего параметра, когда varargs / kwargs не используется (именно поэтому ваш первый пример работает). Однако нельзя указывать запятую после параметра kwargs, если он указан, как показано во второй и третьей строках.
Кстати, вот интересная вещь, показанная грамматикой:
Они оба легальны:
f(a=1, b=2, c=3,)
f(*v, a=1, b=2, c=3)
но это не так:
f(*v, a=1, b=2, c=3,)
Имеет смысл не допускать запятую после **kwargs
, поскольку она всегда должна быть последним параметром. Я не знаю, почему разработчики языка решили не разрешать мой последний пример - может быть, упущение?