В 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 внутри функции.
3
может попасть вkwargs
? Какое ключевое слово он использовал бы? Я не вижу двусмысленности. Обратите внимание, что пустой*
в списке аргументов полезен, только если нет*args
. Это заполнитель, который вы используете вместо*args
. - person Sven Marnach   schedule 26.03.2012