2012-08-04 12 views
9

He sobrecargado algunos operadores de Python, aritmética y booleana. Las reglas de precedencia de Python siguen vigentes, lo que no es natural para los operadores sobrecargados, lo que genera muchos paréntesis en las expresiones. ¿Hay alguna manera de "sobrecargar" las precedencias de Python?Cambiar la precedencia del operador en Python

+5

No. Es parte del lenguaje python en sí. Así es como el lenguaje analiza. – jdi

+1

@jdi Esa es una respuesta, ¿por qué no hacerlo uno? – kojiro

+0

@kojiro: Bueno, solo porque no pude encontrar un enlace a los documentos oficiales de Python indicando que no se puede cambiar. Sin embargo, encontré toneladas de enlaces de terceros. – jdi

Respuesta

8

No. Es parte del lenguaje python en sí. Así es como el lenguaje analiza.

cotización oficial: Evaluation order

Python evalúa las expresiones de izquierda a derecha. Observe que mientras evalúa una tarea, el lado derecho se evalúa antes del lado izquierdo.

Otras citas:

Python:Basics:Numbers and operators

Al realizar operaciones matemáticas con los operadores mixtos, es importante tener en cuenta que Python determina las operaciones que debe realizar primero, basado en un pre-determinado precedencia. Esta precedencia sigue una prioridad similar a para la mayoría de los lenguajes de programación.

Python Programming/Operators

Tenga en cuenta que Python se adhiere a la PEMDAS order of operations.

+6

El problema principal es que python aplica la precedencia del operador al analizar el código.En ese momento temprano, Python no puede saber qué tipos de objetos están realmente involucrados en la expresión (ya que el código aún no se ha ejecutado). Por lo tanto, si fuera posible cambiar la precedencia del operador, lo haría para todas las expresiones, incluidas las expresiones matemáticas comunes. Ahora imagine qué tipo de caos se produciría en la biblioteca estándar y en cualquier biblioteca de terceros si esto fuera posible. – liori

+0

@liori: ¡Buena adición! No podría usar ningún código de terceros mezclado con el suyo bajo el mismo intérprete alterado – jdi

+0

Gracias jdi no solo por decir lo que hace Python, sino por explicar por qué no es posible hacer lo que me gustaría hacer. –

6

puede hacer trampa que el mecanismo de esta manera:

  1. Ignorar todos los operadores a no hacer los cálculos, pero lista de instrucciones envueltas en algún objeto crear.
  2. Agregue su propio operador de corchete (es decir, como una función _).

Ejemplo:

>>> a = MyNumber(5); b = MyNumber(2); c = MyNumber(3) 
>>> a + b * c 
MyExpression([MyNumber(5), '+', MyNumber(2), '*', MyNumber(3)]) 

Soportes:

>>> a + _(b * c) 

Tenga en cuenta que _ es una función que evalúa la expresión (en orden a hacer cumplir en ella)

Así que si se invierte priorites obtendrá:

>>> _(a + b * c) 
MyNumber(21) 

PS. Django hace un truco similar con los operadores Q y F.

Cuestiones relacionadas