Steven D'Aprano <steve+pyt...@pearwood.info> added the comment:
Tim is correct, the behaviour is right, however the docs could be clearer. I think what you are missing is that ``or`` and ``and`` are short-circuiting operators. So in the expression 9 or (anything) the "anything" expression never gets evaluated because 9 is a truthy value. You might get a better example of what is happening if you disassemble the byte-code: py> from dis import dis py> dis(compile("9 or 7 < 'str'", '', 'eval')) 1 0 LOAD_CONST 0 (9) 3 JUMP_IF_TRUE_OR_POP 15 6 LOAD_CONST 1 (7) 9 LOAD_CONST 2 ('str') 12 COMPARE_OP 0 (<) >> 15 RETURN_VALUE Another way to see the order of evaluation is if we make the left hand operand falsey: py> print("first") or print("second") < 'str' first second Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unorderable types: NoneType() < str() In this case, the order of operations is: - evaluate ``print("first")`` (returns None) - since None is falsey, evaluate ``print("second") < 'str'`` - which prints the word "second", then raises an exception. We can get rid of the exception: py> print("first") or str(print("second")) < 'str' first second True I can see how the docs are a little bit confusing if you don't remember that ``or`` and ``and`` are short-circuiting operators. If you would like to propose an improvement to the docs, please suggest something. But the behaviour is correct and is not a bug. https://docs.python.org/3/reference/expressions.html#operator-precedence ---------- nosy: +steven.daprano _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue38060> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com