Author: Carl Friedrich Bolz-Tereick <cfb...@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])) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit