1

一連のテストを自動化しようとしていますが、パラメーターを変更するループが必要です。

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)

test(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}]

print ステートメントで示されているように、 swapRules 関数が単独で呼び出されると、期待される結果が生成されるため、私は本当に困惑しています...私が間違っていることについて何か考えはありますか? ひょっとして何かをキャッシュしているのですか?

4

1 に答える 1

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}]

ただし、以前のアプローチがなぜそうしなかったのかはまだわかりません。

于 2013-07-11T18:52:32.473 に答える