# Augmented assignment test. x = 2 x += 1 x *= 2 x **= 2 x -= 8 x /= 2 x %= 12 x &= 2 x |= 5 x ^= 1 assert x == 6 x = [2] x[0] += 1 x[0] *= 2 x[0] **= 2 x[0] -= 8 x[0] /= 2 x[0] %= 12 x[0] &= 2 x[0] |= 5 x[0] ^= 1 assert x == [6] x = {0: 2} x[0] += 1 x[0] *= 2 x[0] **= 2 x[0] -= 8 x[0] /= 2 x[0] %= 12 x[0] &= 2 x[0] |= 5 x[0] ^= 1 assert x[0] == 6 x = [1,2] x += [3,4] x *= 2 assert x == [1,2,3,4,1,2,3,4] x = [1, 2, 3] y = x x[1:2] *= 2 y[1:2] += [1] assert x == [1, 2, 1, 2, 3] and x is y class aug_test: def __init__(self, value): self.val = value def __radd__(self, val): return self.val + val def __add__(self, val): return aug_test(self.val + val) class aug_test2(aug_test): def __add_ab__(self, val): self.val += val return self class aug_test3(aug_test): def __add_ab__(self, val): return aug_test3(self.val + val) x = aug_test(1) y = x x += 10 assert isinstance(x, aug_test) and y is not x and x.val == 11 x = aug_test2(2) y = x x += 10 assert y is x and x.val == 12 x = aug_test3(3) y = x x += 10 assert isinstance(x, aug_test3) and y is not x and x.val == 13 # Matrix operators test x = 2.0 y = x @ 2 assert y == 4 x = y @@ 2 assert x == 16 y = x @/ y assert y == 4 x = x /@ y assert x == 1/4.0 class testall: def __add__(self, val): print "__add__ called" def __radd__(self, val): print "__radd__ called" def __add_ab__(self, val): print "__add_ab__ called" return self def __sub__(self, val): print "__sub__ called" def __rsub__(self, val): print "__rsub__ called" def __sub_ab__(self, val): print "__sub_ab__ called" return self def __mul__(self, val): print "__mul__ called" def __rmul__(self, val): print "__rmul__ called" def __mmul__(self, val): print "__mmul__ called" def __rmmul__(self, val): print "__rmmul__ called" def __mul_ab__(self, val): print "__mul_ab__ called" return self def __div__(self, val): print "__div__ called" def __rdiv__(self, val): print "__rdiv__ called" def __mldiv__(self, val): print "__mldiv__ called" def __rmldiv__(self, val): print "__rmldiv__ called" def __mrdiv__(self, val): print "__mrdiv__ called" def __rmrdiv__(self, val): print "__rmrdiv__ called" def __div_ab__(self, val): print "__div_ab__ called" return self def __mod__(self, val): print "__mod__ called" def __rmod__(self, val): print "__rmod__ called" def __mod_ab__(self, val): print "__mod_ab__ called" return self def __pow__(self, val): print "__pow__ called" def __rpow__(self, val): print "__rpow__ called" def __mpow__(self, val): print "__mpow__ called" def __rmpow__(self, val): print "__rmpow__ called" def __pow_ab__(self, val): print "__pow_ab__ called" return self def __or__(self, val): print "__or__ called" def __ror__(self, val): print "__ror__ called" def __or_ab__(self, val): print "__or_ab__ called" return self def __and__(self, val): print "__and__ called" def __rand__(self, val): print "__rand__ called" def __and_ab__(self, val): print "__and_ab__ called" return self def __xor__(self, val): print "__xor__ called" def __rxor__(self, val): print "__rxor__ called" def __xor_ab__(self, val): print "__xor_ab__ called" return self def __rshift__(self, val): print "__rshift__ called" def __rrshift__(self, val): print "__rrshift__ called" def __rshift_ab__(self, val): print "__rshift_ab__ called" return self def __lshift__(self, val): print "__lshift__ called" def __rlshift__(self, val): print "__rlshift__ called" def __lshift_ab__(self, val): print "__lshift_ab__ called" return self x = testall() x + 1 1 + x x += 1 x - 1 1 - x x -= 1 x * 1 1 * x x *= 1 x / 1 1 / x x /= 1 x % 1 1 % x x %= 1 x ** 1 1 ** x x **= 1 x | 1 1 | x x |= 1 x & 1 1 & x x &= 1 x ^ 1 1 ^ x x ^= 1 x >> 1 1 >> x x >>= 1 x << 1 1 << x x <<= 1 x @ 1 1 @ x x @/ 1 1 @/ x x /@ 1 1 /@ x x @@ 1 1 @@ x