Me gustaría definir mi propio operador. ¿Python admite tal cosa?Python: ¿definir mis propios operadores?
Respuesta
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.
Vea [abajo] (http://stackoverflow.com/questions/932328/python-defining-my-own-operators#932333) para el conjunto predefinido de operadores de Python. – Palimondo
No, Python viene con un set of operators predefinido, pero sin embargo reemplazable.
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.
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
+1 Ese truco es genial, pero no creo que funcione en esta situación. – Zifre
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
@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
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.
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.
¿Quiere decir que '@' es un nuevo símbolo de operador? ¿O que de alguna manera podemos usarlo para definir nuevos operadores propios? – Addem
Sí, @ es un nuevo símbolo de operador. Sí, puede usarlo para definir operaciones en sus objetos. Considere leer el PEP465. – gg349
@Addem Solo quería decir que '@' es un nuevo operador. Eso es. El hecho sigue siendo: no puede definir operadores propios en Python. –
- 1. ¿Puedes definir tus propios operadores en F #?
- 2. ¿Cómo puedo definir mis propios operadores en el lenguaje de programación Io?
- 3. ¿Definir nuevos operadores en C#?
- 4. ¿Cómo puedo extender datetime.datetime de Python con mis propios métodos?
- 5. Creando mis propios iteradores
- 6. No puedo importar mis propios módulos en Python
- 7. Extendiendo Protobuf con mis propios métodos
- 8. Borrar mis propios datos de aplicaciones programáticamente
- 9. ¿Puedo hacer mis propios guardias en Erlang?
- 10. python numpy ordenar valores propios
- 11. La definición de sus propios operadores de ruta clave en el cacao
- 12. Operadores de Python
- 13. Aprovechamiento de ASP.NET machineKey Para cifrar mis propios datos
- 14. ¿Puedo agregar mis propios fragmentos de código a xcode 4?
- 15. ¿Puedo descargar mis propios binarios de iTunes Connect?
- 16. ¿Puedo usar svchost.exe para alojar mis propios servicios?
- 17. ¿Cómo agregar componentes JSF existentes a mis propios componentes personalizados?
- 18. Python definir funciones dinámicas
- 19. ¿Dónde debería definir mis plantillas de datos?
- 20. ¿Por qué mis unidades están "compiladas con una versión diferente" de mis propios archivos?
- 21. ¿Debo definir un método principal en mis scripts de ruby?
- 22. Múltiples operadores 'in' en Python?
- 23. ¿python tiene operadores de conversión?
- 24. ¿Por qué no puedo definir operadores implícitos y explícitos?
- 25. ¿Cómo debo pasar los datos SSE a mis funciones/operadores?
- 26. Cómo utilizar Google Maps para buscar mis propios datos de localización (la misma funcionalidad que Lugares API de búsqueda, pero para mis propios "lugares")
- 27. ¿Cómo puedo definir mis propias columnas en WPF DataGrid?
- 28. ¿Cómo puedo definir #define en mis archivos Make
- 29. ¿Dónde debería definir mi NinjectModule y mis fábricas?
- 30. operadores de comparación preferidos de Python
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) ' –