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

This commit is contained in:
Raymond Hettinger 2004-12-07 07:05:57 +00:00
parent 84667c063a
commit a6b45cc31d
4 changed files with 16 additions and 33 deletions

View File

@ -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

View File

@ -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:
# 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,12 +1130,6 @@ class Unpickler:
stack = self.stack stack = self.stack
args = stack.pop() args = stack.pop()
func = stack[-1] func = stack[-1]
if args is None:
# A hack for Jim Fulton's ExtensionClass, now deprecated
warnings.warn("__basicnew__ special case is deprecated",
DeprecationWarning)
value = func.__basicnew__()
else:
value = func(*args) value = func(*args)
stack[-1] = value stack[-1] = value
dispatch[REDUCE] = load_reduce dispatch[REDUCE] = load_reduce

View File

@ -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
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.

View File

@ -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)
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: