Не распознает произвольные позиционные аргументы ключевых слов в формате ** kwarg - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь реализовать функцию с 2 аргументами и дополнительным аргументом 3-го произвольного ключевого слова, используя форматирование **kwarg, как показано ниже:

def build_profile(first_name, last_name, **additional_info):
    """ Building a user profile """
    profile = {}
    profile['First name'] = first_name
    profile['Last name'] = last_name
    for key, value in additional_info.items():
        profile[key.title()] = value.title()
    return profile

build_profile("x", 'y', 'x', 'y', 'x', 'y')

Однако это приводит к ошибке:

TypeError: build_profile() takes 2 positional arguments but 6 were given

Мне удалось воспроизвести эту ошибку изолированно, используя следующий код:

def x(**y):
    print(y)

Вывод:

x(1,2,3,4,5)

Это генерирует тот же ответ:

TypeError: x() takes 0 positional arguments but 1 was given

Это привело меня к выводу, что у меня либо:

  1. Проблема с моей конфигурацией Python (работает 3.6.4 в Spyder), либо
  2. Я что-то упускаю ослепительноочевидно.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Вот примеры, если вы хотите минималистичные, понятные подходы.

>>> def x(*args):
...    for arg in args:
...        print(arg)

>>> x(1, 2, 3)
1
2
3

>>> def x(**kwargs):
...    for k, v in kwargs.items():
...        print(k, v)

>>> x(name='john', surname='wick')
name john
surname wick
0 голосов
/ 26 апреля 2018

Синтаксис **kwargs в сигнатуре функции предназначен для принятия произвольного числа ключевого слова аргументов, т.е. аргументов, переданных как f(name=value).

def f(**kwargs):
    # kwargs is a dict here

Синтаксис, используемый для принятия произвольного числа позиционных аргументов, выглядит как *args:

def f(*args):
    # args is a tuple here

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

def f(*splat, **splattysplat):
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...