Why aren't “and” and “or” operators in Python?

大憨熊 提交于 2020-01-01 01:17:34

问题


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?


回答1:


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.




回答2:


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.




回答3:


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




回答4:


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




回答5:


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




回答6:


The list you're looking at is in the section of the docs describing Python's lexical structure: what kinds of tokens Python code is composed of. In terms of the lexical structure, all tokens with the structure of an identifier are classified as identifiers or keywords, regardless of their semantic role. That includes all tokens made of letters.

and and or appear in the list of keyword tokens rather than the list of operator tokens because they are composed of letters:

False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield

If they were spelled && and || instead of and and or, they would have appeared in the list of operator tokens.

In sections of the docs that aren't talking about the lexical structure, and and or are considered operators. For example, they're listed under the Operator column in the operator precedence table.



来源:https://stackoverflow.com/questions/2017230/why-arent-and-and-or-operators-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!