[pypy-commit] pypy py3.7: object.__reduce__ doens't take an argument any more, but __reduce_ex__ requires one
cfbolz
pypy.commits at gmail.com
Mon Jan 20 10:05:18 EST 2020
Author: Carl Friedrich Bolz-Tereick <cfbolz at gmx.de>
Branch: py3.7
Changeset: r98563:46975a7b0a7b
Date: 2020-01-20 15:19 +0100
http://bitbucket.org/pypy/pypy/changeset/46975a7b0a7b/
Log: object.__reduce__ doens't take an argument any more, but
__reduce_ex__ requires one
diff --git a/pypy/objspace/std/objectobject.py b/pypy/objspace/std/objectobject.py
--- a/pypy/objspace/std/objectobject.py
+++ b/pypy/objspace/std/objectobject.py
@@ -210,8 +210,22 @@
w_kwargs = space.w_None
return hasargs, w_args, w_kwargs
+def descr__reduce__(space, w_obj):
+ w_proto = space.newint(0)
+ return reduce_1(space, w_obj, w_proto)
+
@unwrap_spec(proto=int)
-def descr__reduce__(space, w_obj, proto=0):
+def descr__reduce_ex__(space, w_obj, proto):
+ w_st_reduce = space.newtext('__reduce__')
+ w_reduce = space.findattr(w_obj, w_st_reduce)
+ if w_reduce is not None:
+ # Check if __reduce__ has been overridden:
+ # "type(obj).__reduce__ is not object.__reduce__"
+ w_cls_reduce = space.getattr(space.type(w_obj), w_st_reduce)
+ w_obj_reduce = space.getattr(space.w_object, w_st_reduce)
+ override = not space.is_w(w_cls_reduce, w_obj_reduce)
+ if override:
+ return space.call_function(w_reduce)
w_proto = space.newint(proto)
if proto >= 2:
hasargs, w_args, w_kwargs = _getnewargs(space, w_obj)
@@ -227,20 +241,6 @@
return reduce_2(space, w_obj, w_proto, w_args, w_kwargs)
return reduce_1(space, w_obj, w_proto)
- at unwrap_spec(proto=int)
-def descr__reduce_ex__(space, w_obj, proto=0):
- w_st_reduce = space.newtext('__reduce__')
- w_reduce = space.findattr(w_obj, w_st_reduce)
- if w_reduce is not None:
- # Check if __reduce__ has been overridden:
- # "type(obj).__reduce__ is not object.__reduce__"
- w_cls_reduce = space.getattr(space.type(w_obj), w_st_reduce)
- w_obj_reduce = space.getattr(space.w_object, w_st_reduce)
- override = not space.is_w(w_cls_reduce, w_obj_reduce)
- if override:
- return space.call_function(w_reduce)
- return descr__reduce__(space, w_obj, proto)
-
def descr___format__(space, w_obj, w_format_spec):
if space.isinstance_w(w_format_spec, space.w_unicode):
w_as_str = space.call_function(space.w_unicode, w_obj)
diff --git a/pypy/objspace/std/test/test_obj.py b/pypy/objspace/std/test/test_obj.py
--- a/pypy/objspace/std/test/test_obj.py
+++ b/pypy/objspace/std/test/test_obj.py
@@ -71,7 +71,7 @@
return (self._name,), dict(value=int(self))
import copyreg
for protocol in [2, 3, 4]:
- assert NamedInt("Name", value=42).__reduce__(protocol) == (
+ assert NamedInt("Name", value=42).__reduce_ex__(protocol) == (
copyreg.__newobj_ex__,
(NamedInt, ('Name',), dict(value=42)),
dict(_name='Name'), None, None)
@@ -136,6 +136,14 @@
pass
assert X().__reduce_ex__(2)[2] is None
+ def test_reduce_arguments(self):
+ # since python3.7 object.__reduce__ doesn't take an argument anymore
+ # (used to be proto), and __reduce_ex__ requires one
+ with raises(TypeError):
+ object().__reduce__(0)
+ with raises(TypeError):
+ object().__reduce_ex__()
+
def test_default_format(self):
class x(object):
def __str__(self):
More information about the pypy-commit
mailing list