[Python-checkins] cpython (merge 3.6 -> default): Issue #28752: Restored the __reduce__() methods of datetime objects.

serhiy.storchaka python-checkins at python.org
Mon Nov 21 17:30:43 EST 2016


https://hg.python.org/cpython/rev/23140bd66d86
changeset: 105305:23140bd66d86
parent: 105303:1c3bfc5e12f8
parent: 105304:0a2a0061e425
user: Serhiy Storchaka <storchaka at gmail.com>
date: Tue Nov 22 00:30:32 2016 +0200
summary:
 Issue #28752: Restored the __reduce__() methods of datetime objects.
files:
 Lib/datetime.py | 12 ++++++--
 Lib/test/datetimetester.py | 7 ++++
 Misc/NEWS | 2 +
 Modules/_datetimemodule.c | 38 +++++++++++++++++++------
 4 files changed, 46 insertions(+), 13 deletions(-)
diff --git a/Lib/datetime.py b/Lib/datetime.py
--- a/Lib/datetime.py
+++ b/Lib/datetime.py
@@ -932,7 +932,7 @@
 
 # Pickle support.
 
- def _getstate(self, protocol=3):
+ def _getstate(self):
 yhi, ylo = divmod(self._year, 256)
 return bytes([yhi, ylo, self._month, self._day]),
 
@@ -940,8 +940,8 @@
 yhi, ylo, self._month, self._day = string
 self._year = yhi * 256 + ylo
 
- def __reduce_ex__(self, protocol):
- return (self.__class__, self._getstate(protocol))
+ def __reduce__(self):
+ return (self.__class__, self._getstate())
 
 _date_class = date # so functions w/ args named "date" can get at the class
 
@@ -1348,6 +1348,9 @@
 def __reduce_ex__(self, protocol):
 return (time, self._getstate(protocol))
 
+ def __reduce__(self):
+ return self.__reduce_ex__(2)
+
 _time_class = time # so functions w/ args named "time" can get at the class
 
 time.min = time(0, 0, 0)
@@ -1923,6 +1926,9 @@
 def __reduce_ex__(self, protocol):
 return (self.__class__, self._getstate(protocol))
 
+ def __reduce__(self):
+ return self.__reduce_ex__(2)
+
 
 datetime.min = datetime(1, 1, 1)
 datetime.max = datetime(9999, 12, 31, 23, 59, 59, 999999)
diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py
--- a/Lib/test/datetimetester.py
+++ b/Lib/test/datetimetester.py
@@ -1329,6 +1329,7 @@
 green = pickler.dumps(orig, proto)
 derived = unpickler.loads(green)
 self.assertEqual(orig, derived)
+ self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2))
 
 def test_compare(self):
 t1 = self.theclass(2, 3, 4)
@@ -1830,6 +1831,7 @@
 green = pickler.dumps(orig, proto)
 derived = unpickler.loads(green)
 self.assertEqual(orig, derived)
+ self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2))
 
 def test_more_pickling(self):
 a = self.theclass(2003, 2, 7, 16, 48, 37, 444116)
@@ -2469,6 +2471,7 @@
 green = pickler.dumps(orig, proto)
 derived = unpickler.loads(green)
 self.assertEqual(orig, derived)
+ self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2))
 
 def test_pickling_subclass_time(self):
 args = 20, 59, 16, 64**2
@@ -2829,6 +2832,7 @@
 green = pickler.dumps(orig, proto)
 derived = unpickler.loads(green)
 self.assertEqual(orig, derived)
+ self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2))
 
 # Try one with a tzinfo.
 tinfo = PicklableFixedOffset(-300, 'cookie')
@@ -2840,6 +2844,7 @@
 self.assertIsInstance(derived.tzinfo, PicklableFixedOffset)
 self.assertEqual(derived.utcoffset(), timedelta(minutes=-300))
 self.assertEqual(derived.tzname(), 'cookie')
+ self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2))
 
 def test_more_bool(self):
 # time is always True.
@@ -3043,6 +3048,7 @@
 green = pickler.dumps(orig, proto)
 derived = unpickler.loads(green)
 self.assertEqual(orig, derived)
+ self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2))
 
 # Try one with a tzinfo.
 tinfo = PicklableFixedOffset(-300, 'cookie')
@@ -3055,6 +3061,7 @@
 self.assertIsInstance(derived.tzinfo, PicklableFixedOffset)
 self.assertEqual(derived.utcoffset(), timedelta(minutes=-300))
 self.assertEqual(derived.tzname(), 'cookie')
+ self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2))
 
 def test_extreme_hashes(self):
 # If an attempt is made to hash these via subtracting the offset
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -136,6 +136,8 @@
 Library
 -------
 
+- Issue #28752: Restored the __reduce__() methods of datetime objects.
+
 - Issue #28727: Regular expression patterns, _sre.SRE_Pattern objects created
 by re.compile(), become comparable (only x==y and x!=y operators). This
 change should fix the issue #18383: don't duplicate warning filters when the
diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c
--- a/Modules/_datetimemodule.c
+++ b/Modules/_datetimemodule.c
@@ -3954,15 +3954,21 @@
 }
 
 static PyObject *
-time_reduce(PyDateTime_Time *self, PyObject *args)
-{
- int proto = 0;
- if (!PyArg_ParseTuple(args, "|i:__reduce_ex__", &proto))
+time_reduce_ex(PyDateTime_Time *self, PyObject *args)
+{
+ int proto;
+ if (!PyArg_ParseTuple(args, "i:__reduce_ex__", &proto))
 return NULL;
 
 return Py_BuildValue("(ON)", Py_TYPE(self), time_getstate(self, proto));
 }
 
+static PyObject *
+time_reduce(PyDateTime_Time *self, PyObject *arg)
+{
+ return Py_BuildValue("(ON)", Py_TYPE(self), time_getstate(self, 2));
+}
+
 static PyMethodDef time_methods[] = {
 
 {"isoformat", (PyCFunction)time_isoformat, METH_VARARGS | METH_KEYWORDS,
@@ -3988,9 +3994,12 @@
 {"replace", (PyCFunction)time_replace, METH_VARARGS | METH_KEYWORDS,
 PyDoc_STR("Return time with new specified fields.")},
 
- {"__reduce_ex__", (PyCFunction)time_reduce, METH_VARARGS,
+ {"__reduce_ex__", (PyCFunction)time_reduce_ex, METH_VARARGS,
 PyDoc_STR("__reduce_ex__(proto) -> (cls, state)")},
 
+ {"__reduce__", (PyCFunction)time_reduce, METH_NOARGS,
+ PyDoc_STR("__reduce__() -> (cls, state)")},
+
 {NULL, NULL}
 };
 
@@ -5419,15 +5428,21 @@
 }
 
 static PyObject *
-datetime_reduce(PyDateTime_DateTime *self, PyObject *args)
-{
- int proto = 0;
- if (!PyArg_ParseTuple(args, "|i:__reduce_ex__", &proto))
+datetime_reduce_ex(PyDateTime_DateTime *self, PyObject *args)
+{
+ int proto;
+ if (!PyArg_ParseTuple(args, "i:__reduce_ex__", &proto))
 return NULL;
 
 return Py_BuildValue("(ON)", Py_TYPE(self), datetime_getstate(self, proto));
 }
 
+static PyObject *
+datetime_reduce(PyDateTime_DateTime *self, PyObject *arg)
+{
+ return Py_BuildValue("(ON)", Py_TYPE(self), datetime_getstate(self, 2));
+}
+
 static PyMethodDef datetime_methods[] = {
 
 /* Class methods: */
@@ -5502,9 +5517,12 @@
 {"astimezone", (PyCFunction)datetime_astimezone, METH_VARARGS | METH_KEYWORDS,
 PyDoc_STR("tz -> convert to local time in new timezone tz\n")},
 
- {"__reduce_ex__", (PyCFunction)datetime_reduce, METH_VARARGS,
+ {"__reduce_ex__", (PyCFunction)datetime_reduce_ex, METH_VARARGS,
 PyDoc_STR("__reduce_ex__(proto) -> (cls, state)")},
 
+ {"__reduce__", (PyCFunction)datetime_reduce, METH_NOARGS,
+ PyDoc_STR("__reduce__() -> (cls, state)")},
+
 {NULL, NULL}
 };
 
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

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