Можете ли вы объединить расширение аргумента с обычными ключевыми словами? - PullRequest
2 голосов
/ 28 марта 2012

Что я хочу сделать, это:

logged_in = {
    'logged_in': True,
    'username' : 'myself',
    }
print render_template('/path/to/template.html',
    **logged_in,
    title = 'My page title',
    more  = 'even more stuff',
    )

Но это не работает. Есть ли способ объединить расширение словаря с явными аргументами, или мне нужно определить явные аргументы во втором словаре, объединить их и развернуть результат?

Ответы [ 2 ]

5 голосов
/ 28 марта 2012

Расширение ключевого слова должно быть в конце.

print render_template('/path/to/template.html',
    title = 'My page title',
    more  = 'even more stuff',
    **logged_in
)
1 голос
/ 28 марта 2012

Да, у вас это просто задом наперед. Расширение ключевого слова должно быть в конце.

def foo(a,b,c,d):
   print [a,b,c,d]

kwargs = {'b':2,'c':3}
foo(1,d=4,**kwargs)
# prints [1, 2, 3, 4]

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

 foo(1,**kwargs,d=4)
 foo(d=4,**kwargs,1)
 foo(d=4,1,**kwargs)
...