Python: definiendo mis propios operadores?

Me gustaría definir mi propio operador. ¿Python apoya tal cosa?

No, no puedes crear nuevos operadores. Sin embargo, si solo está evaluando expresiones, puede procesar la cadena usted mismo y calcular los resultados de los nuevos operadores.

Aunque técnicamente no puede definir nuevos operadores en Python, este ingenioso hack funciona alrededor de esta limitación. Te permite definir operadores de infijo como este:

 # simple multiplication x=Infix(lambda x,y: x*y) print 2 |x| 4 # => 8 # class checking isa=Infix(lambda x,y: x.__class__==y.__class__) print [1,2,3] |isa| [] print [1,2,3] <> [] # => True 

No, Python viene con un conjunto de operadores predefinidos, pero reemplazables.

Si tiene la intención de aplicar la operación en una clase particular de objetos, simplemente puede anular el operador que coincida con su función más cercana … por ejemplo, al anular __eq__() se anulará el operador == para devolver lo que desee. Esto funciona para casi todos los operadores.

Sage proporciona esta funcionalidad, esencialmente usando el “truco inteligente” descrito por @Ayman Hourieh, pero incorporado a un módulo como decorador para dar una apariencia más limpia y funcionalidad adicional: puede elegir el operador a sobrecargar y por lo tanto el orden de evaluación.

 from sage.misc.decorators import infix_operator @infix_operator('multiply') def dot(a,b): return a.dot_product(b) u=vector([1,2,3]) v=vector([5,4,3]) print(u *dot* v) # => 22 @infix_operator('or') def plus(x,y): return x*y print(2 |plus| 4) # => 6 

Consulte la documentación de Sage y este ticket de seguimiento de mejoras para obtener más información.

Python 3.5 introduce el símbolo @ para un operador adicional.

PEP465 introdujo este nuevo operador para la multiplicación de matrices, para simplificar la notación de muchos códigos numéricos. El operador no se implementará para todos los tipos, sino solo para arrays-como-objetos.

Puede apoyar al operador para sus clases / objetos implementando __matmul__() .

El PEP deja espacio para un uso diferente del operador para objetos que no son matrices.

Por supuesto, puede implementar con @ cualquier tipo de operación diferente de la multiplicación de matrices también para los objetos similares a arrays, pero la experiencia del usuario se verá afectada, porque todos esperarán que su tipo de datos se comporte de una manera diferente.