2013-07-11 1 views
0

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

mydictionary={'a':10,'b':100,'c':30} 

def swapRules(d,rule): 
    "clear dict, set to 100 the rule that match the string" 
    print d, rule 
    if not d.has_key(rule): raise Exception("wrong string") 
    d=resetDict(d) 
    d[rule]=100 
    return d 

def resetDict(d): 
    '''clear the dict ''' 
    for i in d.keys(): 
     d[i]=0 
    return d 

def tests(d): 
    from itertools import starmap, repeat, izip 
    keys=d.keys() 
    paramsDictionaries=list(starmap(swapRules, izip(repeat(d),keys))) 
    print(paramsDictionaries) 

Я не понимаю, почему при выполнении теста (mydictionary) вывод всегда содержит одно и то же значение. Кажется, что проблема не в неправильном использовании itertools: как REPL показывает, подставляя с простым списком понимания:

In [9]: keys=mydictionary.keys() 
In [10]: [tr.swapRules(mydictionary,jj) for jj in keys] 
{'a': 0, 'c': 0, 'b': 100} a 
{'a': 100, 'c': 0, 'b': 0} c 
{'a': 0, 'c': 100, 'b': 0} b 
Out[10]: 
[{'a': 0, 'b': 100, 'c': 0}, 
{'a': 0, 'b': 100, 'c': 0}, 
{'a': 0, 'b': 100, 'c': 0}] 

Я очень озадачен, так как, когда функция swapRules вызывается в одиночку, производит ожидаемый результат, как показывают заявления печати ... любая идея о том, что я делаю неправильно? это каким-то образом кеширование?

+0

Что должно произойти? – user2357112

+0

Я бы ожидал: [{'a': 100, 'b': 0, 'c': 0}, {'a': 0, 'b': 0, 'c': 100}, { 'a': 0, 'b': 100, 'c': 0}] – deddu

ответ

0

Отвечая на мой собственный вопрос, так как я обнаружил, что эта работа:

def swapRules2(d,rule): 
    '''clear dict, return new with only rule set''' 
    keys=d.keys() 
    if rule not in keys: raise Exception("wrong key") 
    outd=dict.fromkeys(keys,0) 
    outd[rule]=100 
    return outd 

и в списке понимание возвращает вывод на ожидается:

In [16]: [tr.swapRules2(mydict,jj) for jj in keys] 
Out[16]: 
[{'a': 100, 'b': 0, 'c': 0}, 
{'a': 0, 'b': 0, 'c': 100}, 
{'a': 0, 'b': 100, 'c': 0}] 

Однако я до сих пор не понять, почему предыдущий подход не сделал.

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