In the model, Data is stored in a dictionary, with dates as keys.
For a variety of reasons, my first choice was to use a QDate for the keys, however this produced odd results.
The following example code should demonstrate.
>>> from PyQt4.QtCore import QDate >>> mydict = {} >>> for year in range(2009,2013): ... dt = QDate(year,1,1) ... while dt.year() == year: ... mydict[d] = "boo" ... dt = dt.addDays(1) >>> >>> mydict.keys()[:3] 3: [PyQt4.QtCore.QDate(2011, 8, 21), PyQt4.QtCore.QDate(2009, 12, 17), PyQt4.QtCore.QDate(2009, 7, 15)] >>> >>> mydict[QDate(2011,8,21)] KeyError: PyQt4.QtCore.QDate(2011, 8, 21)
so what is going on? The dictionary DOES have a key of QDate(2011,8,21)... but is unable to find it.
In debugging, I was reminded that python dictionaries hash the key values and it turns out that there is a known bug in QDate.__hash__
>>> d1 = QDate(2009,12,9) >>> d1.__hash__() 4: 48759696 >>> >>> d2 = QDate(2009,12,9) >>> d2.__hash__() 5: 45344152 >>>
this has been fixed in the very latest versions of PyQt4 I believe (including the python3 version)
In the meantime, I am simply adding a step of conversion to python date types for the keys.
>>> d1.toPyDate().__hash__() 6: 5917697570912074722 >>> d2.toPyDate().__hash__() 7: 5917697570912074722 >>>
No comments:
Post a Comment