[Python-checkins] python/nondist/sandbox/datetime datetime.py,1.100,1.101

tim_one@users.sourceforge.net tim_one@users.sourceforge.net
2002年12月13日 16:27:31 -0800


Update of /cvsroot/python/python/nondist/sandbox/datetime
In directory sc8-pr-cvs1:/tmp/cvs-serv18094
Modified Files:
	datetime.py 
Log Message:
Added pickle support to the Python datetimetz, so far untested.
Unfortunately, this broke the hash test in test_datetime.py, but the
Python datetimetz.__hash__() has deeper problems than just that; e.g.,
>>> from datetime import *
>>> class ga(tzinfo):
... def utcoffset(self, dt): return 1439
...
>>> dt = datetimetz(1, 1, 1, tzinfo=ga())
>>> hash(dt)
Traceback (most recent call last):
 File "<stdin>", line 1, in ?
 File "datetime.py", line 1530, in __hash__
 t = self - timedelta(minutes=tzoff)
 File "datetime.py", line 1483, in __sub__
 return supersub(other) # XXX should set tzinfo on result
 File "datetime.py", line 1318, in __sub__
 return self + -other
 File "datetime.py", line 1473, in __add__
 result = super(datetimetz, self).__add__(other)
 File "datetime.py", line 1302, in __add__
 self._checkOverflow(t.year)
 File "datetime.py", line 672, in _checkOverflow
 raise OverflowError("date +/-: result year %d not in %d..%d" %
OverflowError: date +/-: result year 0 not in 1..9999
>>>
So this mushrooms.
Index: datetime.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/datetime/datetime.py,v
retrieving revision 1.100
retrieving revision 1.101
diff -C2 -d -r1.100 -r1.101
*** datetime.py	13 Dec 2002 22:56:22 -0000	1.100
--- datetime.py	14 Dec 2002 00:27:28 -0000	1.101
***************
*** 1531,1534 ****
--- 1531,1553 ----
 return super(datetimetz, t).__hash__()
 
+ def __getstate__(self):
+ basestate = datetime.__getstate__(self)
+ if self.__tzinfo is None:
+ return (basestate,)
+ else:
+ return (basestate, self.__tzinfo)
+ 
+ def __setstate__(self, state):
+ if not isinstance(state, tuple):
+ raise TypeError("datetimetz.__setstate__() requires a tuple arg")
+ if not 1 <= len(state) <= 2:
+ raise TypeError("datetimetz.__setstate__() requires a 1-tuple or "
+ "2-tuple argument")
+ datetime.__setstate__(self, state[0])
+ if len(state) == 1:
+ self.__tzinfo = None
+ else:
+ self.__tzinfo = state[1]
+ 
 
 datetimetz.min = datetimetz(1, 1, 1)

AltStyle によって変換されたページ (->オリジナル) /