@ operator in python 3.5
Today I learned there is an operator "@" in python 3.5. If you just type 5 @ 5 in python REPL, you will see the next message
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-1-c59396881bea> in <module>() ----> 1 5 @ 5 TypeError: unsupported operand type(s) for @: 'int' and 'int'
New python syntax supports @ operator, however there are no built-in types which can be operands of this operators.
But numpy is.
There is a little example below:
import numpy as np
X = np.array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])
X @ X
There is a very weird behaviour of pygments, it suggests "@" operator is a mistake, but don't care. As you might guess, @ is a matrix multiplication operator. However I suggest, that this is not the only thing for what this operator can be used.
To implement behaviour of operand of "@" we need to define a class with __matmul__, __rmatmul__ and __imatmul__ magic methods. There is a little example below:
class A:
value = None
def __init__(self, value):
self.value = value
def __matmul__(self, other):
return self.value * other.value
def __imatmul__(self, other):
return self.value * other.value
def __rmatmul__(self, other):
return self.value / other.value
def __repr__(self):
return 'A <{value}>'.format(value=self.value)
def __str__(self, *args, **kwargs):
return str(self.value)
if __name__ == '__main__':
print(A(5) @ A(5))
a = A(5)
print(a)
a @= A(5)
print(a)
Code above will produce following out:
25 5 25
Could suggest of a bunch of applications of "@" operator (compositions, transforms etc.), I suggest it shouldn't be restricted only by matrix multiplications.
Happy coding :)