2015-04-15 3 views
1

Пример:Функция принимает kwargs, которые являются ДИКТ, ключи динамически генерируемые строки

def foo(v0 = 'a', v1 = 'b', v2 = 'c'): 
    print(v0, v1, v2) 

for i in range(0, 3): 
    target = "v" + str(i) 
    foo(target = 'z') 

Я хочу следующий вывод:

z b c 
a z c 
a b z 

Но, как он стоит, код выше поднимает следующий TypeError:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-1-7b3fb4086218> in <module>() 
     4 for i in range(0, 3): 
     5  target = "v" + str(i) 
----> 6  foo(target = 'z') 

TypeError: foo() got an unexpected keyword argument 'target' 

Как бы идти о динамической настройки 'цель' 'v0', 'v1' и т.д.?

Это просто пример того, что мне нужно сделать. Для моего случая, нужно использовать вместе с SQLAlchemy, чтобы иметь возможность динамически выбирать таблицу, которую я буду использовать. Я не могу использовать if.

+0

Почему вы не можете использовать, если? –

+2

'foo' не имеет ключевого слова' target'. , , – dbliss

+0

@MattGiltaji По той причине, что может достигать любой ценности, в том числе вновь созданной динамически. – Macabeus

ответ

2

Вы можете назначить ключевые аргументы в функцию распаковывания пунктов словаря с оператором **. Поскольку словари легко поддерживают строки как ключи, очень легко назначить параметры динамической функции:

for i in range(0, 3): 
    foo(**{'v{}'.format(i): 'z'}) 
7

Вы должны использовать Dict с расширением аргумента ключевого слова (**):

for i in range(0, 3): 
    target = "v" + str(i) 
    kwarg = {target: 'z'} 
    foo(**kwarg) 

Или более просто:

for i in range(0, 3): 
    foo(**{"v%s" % i: 'z'}) 
Смежные вопросы