Поведение ошибочной передачи параметров - PullRequest
2 голосов
/ 08 июля 2011

У меня есть функция:

def greeter(name, greeting, punc):
    print greeting+', '+name+punc

У меня есть словарь с параметрами:

params={'name':'Mark','greeting':'How are you','punc':'?'}

Когда я вызываю функцию как greeter(**params), я получаю ожидаемый результат How are you, Mark?. Но когда я звоню вот так greeter(*params), я получаю вывод name, puncgreeting. Похоже, список ключей от params был передан greeter. Что на самом деле здесь происходит?

Просто любопытно.

Ответы [ 2 ]

5 голосов
/ 08 июля 2011

Похоже, список ключей от параметров передан приветствующему. Что на самом деле здесь происходит?

Это действительно то, что происходит, более или менее.

*x ожидает, что x будет итеративным, и повторяет его, интерпретируя результаты как аргументы один за другим. Итерации по dict, по умолчанию, итерации по его ключам. (Вместо этого вы можете получить пары имя / значение, например, с помощью greeter(*(params.items())), но дикт все равно будет не отсортирован, поэтому порядок итерации будет ненадежным.)

2 голосов
/ 08 июля 2011

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

print list(params)
...