Commit a6b45cc3 authored by Raymond Hettinger's avatar Raymond Hettinger

Eliminate the deprecated option to return None instead of a tuple of arguments in __reduce__().

parent 84667c06
...@@ -515,12 +515,8 @@ Otherwise, an \exception{UnpicklingError} will be raised in the ...@@ -515,12 +515,8 @@ Otherwise, an \exception{UnpicklingError} will be raised in the
unpickling environment. Note that as usual, the callable itself is unpickling environment. Note that as usual, the callable itself is
pickled by name. pickled by name.
\item A tuple of arguments for the callable object, or \code{None}. \item A tuple of arguments for the callable object.
\deprecated{2.3}{If this item is \code{None}, then instead of calling \versionchanged[Formerly, this argument could also be \code{None}]{2.5}
the callable directly, its \method{__basicnew__()} method is called
without arguments; this method should also return the unpickled
object. Providing \code{None} is deprecated, however; return a
tuple of arguments instead.}
\item Optionally, the object's state, which will be passed to \item Optionally, the object's state, which will be passed to
the object's \method{__setstate__()} method as described in the object's \method{__setstate__()} method as described in
......
...@@ -33,7 +33,6 @@ import marshal ...@@ -33,7 +33,6 @@ import marshal
import sys import sys
import struct import struct
import re import re
import warnings
__all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler", __all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler",
"Unpickler", "dump", "dumps", "load", "loads"] "Unpickler", "dump", "dumps", "load", "loads"]
...@@ -349,14 +348,7 @@ class Pickler: ...@@ -349,14 +348,7 @@ class Pickler:
# Assert that args is a tuple or None # Assert that args is a tuple or None
if not isinstance(args, TupleType): if not isinstance(args, TupleType):
if args is None: raise PicklingError("args from reduce() should be a tuple")
# A hack for Jim Fulton's ExtensionClass, now deprecated.
# See load_reduce()
warnings.warn("__basicnew__ special case is deprecated",
DeprecationWarning)
else:
raise PicklingError(
"args from reduce() should be a tuple")
# Assert that func is callable # Assert that func is callable
if not callable(func): if not callable(func):
...@@ -1138,13 +1130,7 @@ class Unpickler: ...@@ -1138,13 +1130,7 @@ class Unpickler:
stack = self.stack stack = self.stack
args = stack.pop() args = stack.pop()
func = stack[-1] func = stack[-1]
if args is None: value = func(*args)
# A hack for Jim Fulton's ExtensionClass, now deprecated
warnings.warn("__basicnew__ special case is deprecated",
DeprecationWarning)
value = func.__basicnew__()
else:
value = func(*args)
stack[-1] = value stack[-1] = value
dispatch[REDUCE] = load_reduce dispatch[REDUCE] = load_reduce
......
...@@ -17,6 +17,9 @@ Core and builtins ...@@ -17,6 +17,9 @@ Core and builtins
Extension Modules Extension Modules
----------------- -----------------
- the cPickle module no longer accepts the deprecated None option in the
args tuple returned by __reduce__().
- itertools.islice() now accepts None for the start and step arguments. - itertools.islice() now accepts None for the start and step arguments.
This allows islice() to work more readily with slices: This allows islice() to work more readily with slices:
islice(s.start, s.stop, s.step) islice(s.start, s.stop, s.step)
...@@ -25,6 +28,9 @@ Extension Modules ...@@ -25,6 +28,9 @@ Extension Modules
Library Library
------- -------
- the pickle module no longer accepts the deprecated None option in the
args tuple returned by __reduce__().
- optparse now optionally imports gettext. This allows its use in setup.py. - optparse now optionally imports gettext. This allows its use in setup.py.
- the deprecated tzparse module was removed. - the deprecated tzparse module was removed.
......
...@@ -2143,6 +2143,12 @@ save_reduce(Picklerobject *self, PyObject *args, PyObject *ob) ...@@ -2143,6 +2143,12 @@ save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
&dictitems)) &dictitems))
return -1; return -1;
if (!PyTuple_Check(argtup)) {
PyErr_SetString(PicklingError,
"args from reduce() should be a tuple");
return -1;
}
if (state == Py_None) if (state == Py_None)
state = NULL; state = NULL;
if (listitems == Py_None) if (listitems == Py_None)
...@@ -3616,17 +3622,6 @@ Instance_New(PyObject *cls, PyObject *args) ...@@ -3616,17 +3622,6 @@ Instance_New(PyObject *cls, PyObject *args)
else goto err; else goto err;
} }
if (args==Py_None) {
/* Special case, call cls.__basicnew__() */
PyObject *basicnew;
basicnew = PyObject_GetAttr(cls, __basicnew___str);
if (!basicnew) return NULL;
r=PyObject_CallObject(basicnew, NULL);
Py_DECREF(basicnew);
if (r) return r;
}
if ((r=PyObject_CallObject(cls, args))) return r; if ((r=PyObject_CallObject(cls, args))) return r;
err: err:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment