2012-06-25 4 views
0

Давайте создадим простой кортеж, словарь и функцию.func (* tuple) 'раскалывает кортежи, но как работает функция func (** dictionary)?

>>> tup = (7, 3) 
>>> dic = {"kw1":7, "kw2":3} 
>>> def pr(a, b): 
... print a, b 

Ниже показано, что * делает перед кортежем и словаря в качестве аргумента.

>>> pr(tup) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: pr() takes exactly 2 arguments (1 given) 

>>> pr(*tup) 
7 3 

>>> pr(*dic) 
kw1 kw2 

Теперь давайте попробуем ** перед аргументом.

>>> pr(**tup) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: pr() argument after ** must be a mapping, not tuple 

Хорошо, кажется ** работает только при использовании словаря в качестве аргумента. Итак, давайте попробуем это со словарем.

>>> pr(**dic) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: pr() got an unexpected keyword argument 'kw1' 

Что? Может ли кто-нибудь показать мне пример этого последнего случая, который не вызывает ошибку?

ответ

2

Ваш pr функция принимает аргументы a и b, не kw1 и kw2.

>>> def pr(a, b): 
... print a, b 
... 
>>> 
>>> d = {'a': 1, 'b':2} 
>>> pr(**d) 
1 2 
2

Обозначение **dict означает, что ваш словарь превращается в аргументы ключевых слов. Если функция не имеет необходимого ключевого слова, тогда она вернет ошибку, как вы это пережили.

В вашем случае это бы работать, если вы определили свою функцию следующим образом:

>>> def pr(kw1, kw2): 
... print kw1, kw2 
+0

Вы и Daniel как ответить на этот вопрос, но по-другому, если бы я мог тикать оба ответа, как правильный один я бы. – Bentley4

+0

Это stackoverflow;) –

+0

Я бросил монету, и Даниил выиграл. Прости меня. – Bentley4

3

Чтобы добавить другие ответы, вы можете использовать *args и **kwargs в определении функции для поддержки произвольных аргументов. Это может сделать код менее явным. Но для отладочных целей, гибкости и скорости разработки, это может иметь смысл принять:

(. */** -notation в определении функции, как «обратной» операция по аргументу распаковки операции по вызову функции)

def foo(*args, **kwargs): 
    for v in args: 
     print v 
    for v in kwargs: 
     print v, "->", kwargs[v] 

dic = {"kw1":7, "kw2":3} 

foo(dic) 
# prints: 
# {'kw1': 7, 'kw2': 3} 

foo(**dic) 
# prints: 
# kw1 -> 7 
# kw2 -> 3 

некоторые связанные ссылки на документацию:

+0

Благодарим вас за ответ. Хотя ваш ответ полезен, я поцеловал ответ Даниэля за его краткость и потому, что он был первым. – Bentley4

+0

@ Bentley4 - абсолютно, тем более, что мой ответ напрямую не отвечает на ваш вопрос, но пытается дать дополнительную информацию. – moooeeeep

Смежные вопросы