views:

331

answers:

6

I wasn't aware of this, but apparently the and and or keywords aren't operators. They don't appear in the list of python operators. Just out of sheer curiosity, why is this? And if they aren't operators, what exactly are they?

A: 

They're classifying them as keywords earlier in the document.

Jacob
True, but that doesn't really mean anything other than that they can't be used as variable names.
Jason Baker
The URL the OP linked to has to do with lexical analysis, and lexically, they're keywords, not operators. If the question was phrased as one of syntax, then the down-vote would make sense.
Jacob
A: 

They're keywords, because they're reserved identifiers, not special tokens of symbols.

ephemient
A: 

They can't be redefined to support type-specific operations, so they don't fall under the scope of the other operators.

Ignacio Vazquez-Abrams
I suspect your causation is wrong. They can't be redefined to support type-specific operations because they're not operators.
Jason Baker
+23  A: 

Because they're control flow constructs. Specifically:

  • if the left argument to and evaluates to False, the right argument doesn't get evaluated at all
  • if the left argument to or evaluates to True, the right argument doesn't get evaluated at all

Thus, it is not simply a matter of being reserved words. They don't behave like operators, since operators always evaluate all of their arguments.

You can contrast this with bitwise binary operators which, as the name implies, are operators:

>>> 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

As you see, the bitwise OR (|) evaluates both its arguments. The or keyword, however, doesn't evaluate its right argument at all when the left argument evaluates to True; that's why no ZeroDivisionError is raised in the second statement.

Antoine P.
Craig McQueen
Yes, I agree the terminology can be varying. The main point though is that they have fundamentally different characteristics than what Python generally calls operators.
Antoine P.
+5  A: 

Python does not currently provide any 'xxx' special methods corresponding to the 'and', 'or' and 'not' boolean operators. In the case of 'and' and 'or', the most likely reason is that these operators have short-circuiting semantics, i.e. the second operand is not evaluated if the result can be determined from the first operand. The usual technique of providing special methods for these operators therefore would not work.

Source: PEP 335

PEP 335 talks about adding the ability to have overloadable operators, and discusses this issue a bit.

Seth