2010-01-06 17 views

Respuesta

40

Porque son construcciones de flujo de control. Específicamente:

  • si el argumento izquierdo para and se evalúa como falsa, el argumento de la derecha no se evalúan en absoluto
  • si el argumento izquierdo para or se evalúa como True, el argumento de la derecha no consigue evaluado en todo

Por lo tanto, no es simplemente una cuestión de palabras reservadas. No se comportan como operadores, ya que los operadores siempre evalúan todos sus argumentos.

Se puede comparar esto con bit a bit operadores binarios que, como su nombre lo indica, son operadores:

>>> 1 | (1/0) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ZeroDivisionError: integer division or modulo by zero 
>>> 1 or (1/0) 
1 

Como se ve, el operador OR (|) evalúa tanto sus argumentos. La palabra clave or, sin embargo, no evalúa su argumento correcto cuando el argumento de la izquierda se evalúa como True; es por eso que no se plantea ZeroDivisionError en la segunda declaración.

+12

Nota, en C, '&&' y '||' se llaman "operadores" aunque estén en cortocircuito (no evalúe el lado derecho según el valor del lado izquierdo). Del mismo modo para algunos otros idiomas. –

+1

Sí, acepto que la terminología puede variar. Sin embargo, el punto principal es que tienen características fundamentalmente diferentes a las que Python generalmente llama operadores. –

0

Están clasificándolos como palabras clave anteriormente en el documento.

+3

Cierto, pero eso en realidad no significa nada más que no se pueden usar como nombres de variables. –

+0

La URL a la que se vincula el OP tiene que ver con el análisis léxico, y léxicamente, son palabras clave, no operadores. Si la pregunta fue redactada como una de sintaxis, entonces el voto abajo tendría sentido. – Jacob

0

Son keywords, porque son identificadores reservados, no tokens especiales de símbolos.

0

No se pueden redefinir para admitir operaciones específicas del tipo, por lo que no entran en el ámbito de los otros operadores.

+2

Sospecho que tu relación de causalidad es incorrecta. No se pueden redefinir para admitir operaciones específicas de tipo porque no son operadores. –

6

Python no proporciona actualmente ningún 'xxx' métodos especiales correspondientes a la 'y', 'o' y 'no' operadores booleanos. En el caso de 'y' y 'o', la razón más probable es que estos operadores tengan semántica de cortocircuito, es decir, el segundo operando no se evalúa si el resultado puede determinarse a partir del primer operando. La técnica habitual de proporcionar métodos especiales para estos operadores, por lo tanto, no funcionaría.

Fuente: PEP 335

PEP 335 habla de la adición de la capacidad de tener operadores sobrecargable, y trata este problema un poco.

Cuestiones relacionadas