[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