2014-09-23 24 views
1

У меня есть функция, которая имеет следующую подпись:Найти все возможные комбинации аргументов в Python

def function(a=None, b=None, c=None): 
    # ... some more code ... 

Если он будет принят, а, б и может быть только булевы.

Я хочу знать все допустимые комбинации a, b и c.

Обратите внимание, что a, b и c являются необязательными, поэтому эту функцию можно вызвать всего лишь с 0 параметрами и целых 3 параметра.

Я в состоянии получить все возможные комбинации аргументов:

arg_names = ['a', 'b', 'c'] 
arg_values = [None, True, False] 

arg_combinations = [] 
for i in range(len(arg_names)): 
    arg_combinations += list(
     itertools.combinations(arg_names, i + 1) 
    ) 

который производит:

[('a',), ('b',), ('c',), ('a', 'b'), ('a', 'c'), ('b', 'c'), ('a', 'b', 'c')] 

Однако я не в состоянии двигаться дальше, создавая все возможные комбинации параметров и значения:

arg_value_combinations = [] 
for c in arg_combinations: 
    arg_value_combinations += list(
     itertools.product(c, arg_values) 
    ) 

print arg_value_combinations 

который производит:

[('a', None), ('a', True), ('a', False), ('b', None), ('b', True), ('b', False), ('c', None), ('c', True), ('c', False), ('a', None), ('a', True), ('a', False), ('b', None), ('b', True), ('b', False), ('a', None), ('a', True), ('a', False), ('c', None), ('c', True), ('c', False), ('b', None), ('b', True), ('b', False), ('c', None), ('c', True), ('c', False), ('a', None), ('a', True), ('a', False), ('b', None), ('b', True), ('b', False), ('c', None), ('c', True), ('c', False)] 

Определенно неправильный путь.

ответ

4

Если каждое значение может содержать None, False или True, просто производить эти комбинации (с itertools.product(), и отфильтровать элементы, которые определены None:

from itertools import product 

for combo in product((None, True, False), repeat=3): 
    arguments = {k: v for k, v in zip('abc', combo) if v is not None} 
    print arguments 

Это дает:

>>> from itertools import product 
>>> for combo in product((None, True, False), repeat=3): 
...  arguments = {k: v for k, v in zip('abc', combo) if v is not None} 
...  print arguments 
... 
{} 
{'c': True} 
{'c': False} 
{'b': True} 
{'c': True, 'b': True} 
{'c': False, 'b': True} 
{'b': False} 
{'c': True, 'b': False} 
{'c': False, 'b': False} 
{'a': True} 
{'a': True, 'c': True} 
{'a': True, 'c': False} 
{'a': True, 'b': True} 
{'a': True, 'c': True, 'b': True} 
{'a': True, 'c': False, 'b': True} 
{'a': True, 'b': False} 
{'a': True, 'c': True, 'b': False} 
{'a': True, 'c': False, 'b': False} 
{'a': False} 
{'a': False, 'c': True} 
{'a': False, 'c': False} 
{'a': False, 'b': True} 
{'a': False, 'c': True, 'b': True} 
{'a': False, 'c': False, 'b': True} 
{'a': False, 'b': False} 
{'a': False, 'c': True, 'b': False} 
{'a': False, 'c': False, 'b': False} 
+0

Я определенно Непонятое повторение в itertools.product. Спасибо за помощь, несмотря на несовершенства вопроса. –

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