Python: передача параметров по имени вместе с kwargs

В python мы можем сделать это:

def myFun1(one = '1', two = '2'):
    ...

Затем мы можем вызвать функцию и передать аргументы по их имени:

myFun1(two = 'two', one = 'one')

Также мы можем сделать это:

def myFun2(**kwargs):
    print kwargs.get('one', 'nothing here')

myFun2(one='one')

Итак, мне было интересно, можно ли комбинировать оба метода, например:

def myFun3(name, lname, **other_info):
    ...

myFun3(lname='Someone', name='myName', city='cityName', otherInfo='blah')

В целом, какие комбинации мы можем сделать?

Спасибо и извините за мой глупый вопрос

Ответы

Ответ 1

Общая идея:

def func(arg1, arg2, ..., kwarg1=default, kwarg2=default, ..., *args, **kwargs):
    ...

Вы можете использовать столько, сколько хотите. * и ** будут "впитывать" любые оставшиеся значения, которые иначе не учитывались.

Позиционные аргументы (предоставленные без по умолчанию) не могут быть заданы по ключевому слову, а аргументы, отличные от значения по умолчанию, не могут соответствовать аргументам по умолчанию.

Примечание. Python 3 также добавляет возможность указывать аргументы только для ключевого слова, имея их после *:

def func(arg1, arg2, *args, kwonlyarg=default):
    ...

Вы также можете использовать только * (def func(a1, a2, *, kw=d):), что означает, что никакие аргументы не были захвачены, но все, что было после ключевого слова.

Итак, если вы в 3.x, вы можете создать поведение, которое хотите:

def myFun3(*, name, lname, **other_info):
    ...

Это позволит вызывать с name и lname только по ключевым словам.

Обратите внимание, что это необычный интерфейс, который может раздражать пользователя - я бы использовал его только в особых случаях использования.

В 2.x вам нужно вручную сделать это, проанализировав **kwargs.