[pypy-commit] pypy py3.6: merge default

cfbolz pypy.commits at gmail.com
Thu Jan 30 06:01:50 EST 2020


Author: Carl Friedrich Bolz-Tereick <cfbolz at gmx.de>
Branch: py3.6
Changeset: r98600:75200e919c58
Date: 2020-01-30 11:59 +0100
http://bitbucket.org/pypy/pypy/changeset/75200e919c58/

Log:	merge default

diff --git a/pypy/objspace/std/setobject.py b/pypy/objspace/std/setobject.py
--- a/pypy/objspace/std/setobject.py
+++ b/pypy/objspace/std/setobject.py
@@ -247,10 +247,16 @@
             return space.w_NotImplemented
         return self.difference(w_other)
 
+    def descr_rsub(self, space, w_other):
+        if not isinstance(w_other, W_BaseSetObject):
+            return space.w_NotImplemented
+        return w_other.difference(self)
+
     def descr_and(self, space, w_other):
         if not isinstance(w_other, W_BaseSetObject):
             return space.w_NotImplemented
         return self.intersect(w_other)
+    descr_rand = descr_and # symmetric
 
     def descr_or(self, space, w_other):
         if not isinstance(w_other, W_BaseSetObject):
@@ -258,11 +264,13 @@
         w_copy = self.copy_real()
         w_copy.update(w_other)
         return w_copy
+    descr_ror = descr_or # symmetric
 
     def descr_xor(self, space, w_other):
         if not isinstance(w_other, W_BaseSetObject):
             return space.w_NotImplemented
         return self.symmetric_difference(w_other)
+    descr_rxor = descr_xor # symmetric
 
     def descr_inplace_sub(self, space, w_other):
         if not isinstance(w_other, W_BaseSetObject):
@@ -528,9 +536,13 @@
     __iter__ = gateway.interp2app(W_BaseSetObject.descr_iter),
     __contains__ = gateway.interp2app(W_BaseSetObject.descr_contains),
     __sub__ = gateway.interp2app(W_BaseSetObject.descr_sub),
+    __rsub__ = gateway.interp2app(W_BaseSetObject.descr_rsub),
     __and__ = gateway.interp2app(W_BaseSetObject.descr_and),
+    __rand__ = gateway.interp2app(W_BaseSetObject.descr_rand),
     __or__ = gateway.interp2app(W_BaseSetObject.descr_or),
+    __ror__ = gateway.interp2app(W_BaseSetObject.descr_ror),
     __xor__ = gateway.interp2app(W_BaseSetObject.descr_xor),
+    __rxor__ = gateway.interp2app(W_BaseSetObject.descr_rxor),
 
     # mutating operators
     __isub__ = gateway.interp2app(W_BaseSetObject.descr_inplace_sub),
@@ -644,9 +656,13 @@
     __iter__ = gateway.interp2app(W_BaseSetObject.descr_iter),
     __contains__ = gateway.interp2app(W_BaseSetObject.descr_contains),
     __sub__ = gateway.interp2app(W_BaseSetObject.descr_sub),
+    __rsub__ = gateway.interp2app(W_BaseSetObject.descr_rsub),
     __and__ = gateway.interp2app(W_BaseSetObject.descr_and),
+    __rand__ = gateway.interp2app(W_BaseSetObject.descr_rand),
     __or__ = gateway.interp2app(W_BaseSetObject.descr_or),
+    __ror__ = gateway.interp2app(W_BaseSetObject.descr_ror),
     __xor__ = gateway.interp2app(W_BaseSetObject.descr_xor),
+    __rxor__ = gateway.interp2app(W_BaseSetObject.descr_rxor),
 
     # non-mutating methods
     __reduce__ = gateway.interp2app(W_BaseSetObject.descr_reduce),
diff --git a/pypy/objspace/std/test/test_setobject.py b/pypy/objspace/std/test/test_setobject.py
--- a/pypy/objspace/std/test/test_setobject.py
+++ b/pypy/objspace/std/test/test_setobject.py
@@ -650,6 +650,40 @@
             assert type(t) is base
             assert not hasattr(t, 'x')
 
+    def test_reverse_ops(self):
+        assert set.__rxor__
+        assert frozenset.__rxor__
+        assert set.__ror__
+        assert frozenset.__ror__
+        assert set.__rand__
+        assert frozenset.__rand__
+        assert set.__rsub__
+        assert frozenset.__rsub__
+
+        # actual behaviour test
+        for base in [set, frozenset]:
+            class S(base):
+                def __xor__(self, other):
+                    if type(other) is not S:
+                        return NotImplemented
+                    return 1
+                __or__ = __and__ = __sub__ = __xor__
+            assert S([1, 2, 3]) ^ S([2, 3, 4]) == 1
+            assert S([1, 2, 3]) ^ {2, 3, 4} == {1, 4}
+            assert {1, 2, 3} ^ S([2, 3, 4]) == {1, 4}
+
+            assert S([1, 2, 3]) & S([2, 3, 4]) == 1
+            assert S([1, 2, 3]) & {2, 3, 4} == {2, 3}
+            assert {1, 2, 3} & S([2, 3, 4]) == {2, 3}
+
+            assert S([1, 2, 3]) | S([2, 3, 4]) == 1
+            assert S([1, 2, 3]) | {2, 3, 4} == {1, 2, 3, 4}
+            assert {1, 2, 3} | S([2, 3, 4]) == {1, 2, 3, 4}
+
+            assert S([1, 2, 3]) - S([2, 3, 4]) == 1
+            assert S([1, 2, 3]) - {2, 3, 4} == {1}
+            assert {1, 2, 3} - S([2, 3, 4]) == {1}
+
     def test_isdisjoint(self):
         assert set([1,2,3]).isdisjoint(set([4,5,6]))
         assert set([1,2,3]).isdisjoint(frozenset([4,5,6]))


More information about the pypy-commit mailing list