Вызов функции Python с аргументами *args,**kwargs и необязательными аргументами/аргументами по умолчанию

В python я могу определить функцию следующим образом:

def func(kw1=None,kw2=None,**kwargs):
   ...

В этом случае я могу вызвать func как:

func(kw1=3,kw2=4,who_knows_if_this_will_be_used=7,more_kwargs=Ellipsis)

Я также могу определить функцию как:

def func(arg1,arg2,*args):
    ...

которую можно вызвать как

func(3,4,additional,arguments,go,here,Ellipsis)

Наконец, я могу объединить две формы

def func(arg1,arg2,*args,**kwargs):
    ...

Но что не работает, так это вызов:

func(arg1,arg2,*args,kw1=None,kw2=None,**kwargs):  #SYNTAX ERROR (in python 2 only,  apparently this works in python 3)
    ...

Моя первоначальная мысль заключалась в том, что это, вероятно, потому, что функция

def func(arg1,arg2,*args,kw1=None):
    ...

может быть вызвана как

func(1,2,3) #kw1 will be assigned 3

Таким образом, это вводило бы некоторая двусмысленность относительно того, следует ли упаковывать 3 в args или kwargs. Однако в Python 3 есть возможность указывать аргументы только по ключевым словам:

def func(a,b,*,kw=None):  #can be called as func(1,2), func(1,2,kw=3), but NOT func(1,2,3)
   ...

При этом кажется, что нет синтаксической двусмысленности с:

def func(a,b,*args,*,kw1=None,**kwargs):
    ...

Однако это по-прежнему вызывает синтаксическую ошибку (проверено с Python3.2). ). Есть ли причина для этого, что мне не хватает? И есть ли способ получить поведение, описанное выше (имея *args с аргументами по умолчанию) - я знаю, что могу смоделировать это поведение, манипулируя словарем kwargs внутри функции.

58
задан dreftymac 12 April 2019 в 22:15
поделиться