Python: создание неизвестного числа переменных с использованием for-loop

Я хочу создать генератор, который принимает любое количество аргументов ключевого слова, и он вернет произведение значений (укажите в качестве кортежей, как показано ниже).

У меня возникли проблемы с отказом от жесткого hardcoded_a переменных цикла for ( hardcoded_a , hardcoded_b ). В этом случае, если я использую более или менее двух аргументов, он дает значение ValueError . Меня не волнует жесткая кодировка переменных «okay». Как я могу это сделать, независимо от того, сколько предметов я перехожу в kwargs, я все еще могу получить продукт?

Это то, что я написал до сих пор:

 from itertools import product def gen(**kwargs): options = {} [options.update({k: v}) for k, v in kwargs.iteritems()] for hardcoded_a, hardcoded_b in product(*(tuple(options.values()))): yield hardcoded_a, hardcoded_b for okay_var1, okay_var2 in gen(dollar=(2, 20), hungry=(True, False)): print okay_var1, okay_var2 

Я думаю, что вы ищете следующее:

 def gen(**kwargs): options = {} [options.update({k: v}) for k, v in kwargs.iteritems()] for prod in product(*(tuple(options.values()))): yield dict(zip(options, prod)) 

или еще более чистое решение:

 def gen(**kwargs): for prod in product(*kwargs.values()): yield dict(zip(kwargs, prod)) 

Если я неправильно понимаю вашу цель, то должно работать следующее:

 from itertools import product def gen(**kwargs): return product(*kwargs.values()) 

Пример:

 >>> print(list(gen(dollar=(2,20), hungry=(True,False)))) [(True, 2), (True, 20), (False, 2), (False, 20)] 

Однако стоит отметить, что у kwargs.values() не гарантируется определенный порядок. Это позволит убедиться, что они упорядочены по «естественному заказу» (сравнение строк) ключевых слов:

 def gen2(**kwargs): return product(*map(lambda t:t[1],sorted(k.items()))) 

А сейчас:

 >>> print(list(gen2(dollar=(2,20), hungry=(True,False)))) [(2, True), (2, False), (20, True), (20, False)]