[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