2016-11-02 6 views
0

私はGUI用の単純なデータモデルクラスを持っています。このクラスでは、キーワード引数 "timeDict"を渡さない場合にタイムスタンプを付加するaddPntメソッドがあります。私はデフォルト値({})がaddPntを呼び出すたびにtimeDictに設定されることを期待していました。しかし、デバッグ中は、timeDictは最初の呼び出しからの値をaddPntに保持します。以下のコードを参照Strange Behavior ....呼び出し後にキーワード引数を保持するPythonクラスバインドメソッド

class LastTSDict(dict): 
    def __getitem__(self, name): 
     try: 
      return super(LastTSDict, self).__getitem__(name) 
     except KeyError: 
      self.__setitem__(name,timestamp.getTimestamp()) 
      return self.__getitem__(name) 

class DataElementDict(dict): 
    def __init__(self,maxLen): 
     self.maxLen=maxLen 
     self.lastTS=LastTSDict() 
    def __getitem__(self, name): 
     try: 
      return super(DataElementDict, self).__getitem__(name) 
     except KeyError: 
      if name==0: 
       self.__setitem__(name,defaultdict(partial(defaultdict,partial(deque, maxlen=self.maxLen)))) 
      else: 
       self.__setitem__(name,defaultdict(partial(defaultdict,partial(deque, maxlen=self.maxLen/8)))) 
      return self.__getitem__(name) 

class Model(object): 
    def __init__(self,maxLen=8192,extPeriods=[5,60,300,900,3600,86400]): 
     self.DATA=DataElementDict(maxLen) 
     self.extPeriods=extPeriods 

    def addPnt(self,key,value,timeDict={}): 
     try: 
      pdb.set_trace() 
      if 'ts' not in timeDict.keys(): 
       timeDict['ts']=timestamp.getTimestamp() 
      if 'tu' not in timeDict.keys(): 
       timeDict['tu']=timestamp.unixTime(timeDict['ts']) 
      self.DATA[0][key]['v'].append(value) 
      for keyt in timeDict.keys(): 
       self.DATA[0][key][keyt].append(timeDict[keyt]) 

ここでは何が起こっていますか?

答えて

1

デフォルト引数の値は、関数の定義時に1回だけ作成されます。

def addPnt(self,key,value,timeDict={}): 

これは、すべての呼び出しが同じ辞書オブジェクトを使用することを意味します。 1回の呼び出しごとに新しいものではありません。この使用を修正するには

def addPnt(self,key,value,timeDict=None): 
    if timeDict is None: 
     timeDict = {} 
+0

おかげで、知っていたことはありません – scientificCompNoob