奇怪的行为…Python类绑定方法保留关键字参数

2024-10-04 11:26:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的GUI数据模型类。在这个类中,我有一个addPnt方法,如果没有通过关键字参数“timeDict”传递时间戳,它会附加一个时间戳。我希望在每次调用addPnt时,默认值({})都设置为timeDict。但是,在调试时,timeDict会保留对addPnt的初始调用中的值?!?!参见下面的代码

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

这是怎么回事


Tags: nameselfreturndefpartialtimestampclasstry
1条回答
网友
1楼 · 发布于 2024-10-04 11:26:59

默认参数的值仅在函数定义时创建一次

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

这意味着每个调用都使用相同的dictionary对象。每次通话都不是新的

要解决此问题,请执行以下操作:

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

相关问题 更多 >