2009-05-31 28 views
50

Me gustaría definir mi propio operador. ¿Python admite tal cosa?Python: ¿definir mis propios operadores?

+0

Bueno, podría tener un operador que no está definido (como '$') y luego usar algún código python para editarse (con 'abrir') y cambiar toda la función' a $ b' a '(a, b) ' –

Respuesta

25

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

+0

Vea [abajo] (http://stackoverflow.com/questions/932328/python-defining-my-own-operators#932333) para el conjunto predefinido de operadores de Python. – Palimondo

7

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

143

Si bien técnicamente no puede definir nuevos operadores en Python, este clever hack funciona alrededor de esta limitación. Se le permite definir operadores infijos así:

# 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] <<isa>> [] 
# => True 
+2

+1 Ese truco es genial, pero no creo que funcione en esta situación. – Zifre

+7

Podría ser un truco interesante, pero no creo que esta sea una buena solución. Python no permite crear operadores propios, una decisión de diseño que se creó por una buena razón y usted debe aceptarla en lugar de ver esto como un problema e inventar formas de evitarlo. No es una buena idea luchar contra el idioma en el que escribe el código. Si realmente lo desea, debería usar un idioma diferente. – DasIch

+50

@DasIch No podría estar más en desacuerdo. No todos somos libres de elegir un idioma deliberadamente. Por otro lado, no veo por qué debería conformarme con las decisiones de diseño de otra persona si no estoy satisfecho. - Excelente hack de hecho! – ThomasH

6

Sage ofrece esta funcionalidad, esencialmente mediante el "artilugio ingenioso" descrito por @Ayman Hourieh, pero incorporado en un módulo como un decorador para dar una apariencia más limpia y adicionales funcionalidad: puede elegir sobrecargar al operador 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 

Ver the Sage documentation y this enhancement tracking ticket para más información.

6

Python 3.5 presenta 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 matrices 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 sean de tipo arrays.

Por supuesto que se pueden implementar con @ cualquier tipo de operación diferente de la multiplicación de matrices también para objetos arrays como, pero la experiencia del usuario se verá afectada, porque todo el mundo va a esperar que su tipo de datos se comporte de una manera diferente.

+0

¿Quiere decir que '@' es un nuevo símbolo de operador? ¿O que de alguna manera podemos usarlo para definir nuevos operadores propios? – Addem

+0

Sí, @ es un nuevo símbolo de operador. Sí, puede usarlo para definir operaciones en sus objetos. Considere leer el PEP465. – gg349

+3

@Addem Solo quería decir que '@' es un nuevo operador. Eso es. El hecho sigue siendo: no puede definir operadores propios en Python. –

Cuestiones relacionadas