[pypy-commit] pypy default: add missing reverse operations to set and frozenset objects

cfbolz pypy.commits at gmail.com
Thu Jan 30 05:39:29 EST 2020


Author: Carl Friedrich Bolz-Tereick <cfbolz at gmx.de>
Branch: 
Changeset: r98599:67454ea967cb
Date: 2020-01-30 11:34 +0100
http://bitbucket.org/pypy/pypy/changeset/67454ea967cb/

Log:	add missing reverse operations to set and frozenset objects

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
@@ -254,10 +254,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):
@@ -265,11 +271,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):
@@ -541,9 +549,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),
@@ -663,9 +675,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
@@ -610,6 +610,40 @@
             assert type(t) is subset
             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