On Sun, Apr 17, 2011 at 8:38 AM, Ben Finney <ben+pyt...@benfinney.id.au> wrote: > It won't look up the *name* ‘bool’, but it will use that object. Any > boolean expression is going to be calling the built-in ‘bool’ type > constructor. > > So the answer to the OP's question is no: the function isn't equivalent > to the type, because the OP's ‘bool_equivalent’ function necessarily > uses the built-in ‘bool’ type, while the reverse is not true.
Actually, as I was curious myself, I've checked sources and found that `True if x else False` will _not_ call bool(), it calls PyObject_IsTrue() pretty much directly. >>> import dis >>> def bool2(x): ... return True if x else False ... >>> dis.dis(bool2) 2 0 LOAD_FAST 0 (x) 3 POP_JUMP_IF_FALSE 10 6 LOAD_GLOBAL 0 (True) 9 RETURN_VALUE >> 10 LOAD_GLOBAL 1 (False) 13 RETURN_VALUE case POP_JUMP_IF_FALSE: w = POP(); if (w == Py_True) { Py_DECREF(w); goto fast_next_opcode; } if (w == Py_False) { Py_DECREF(w); JUMPTO(oparg); goto fast_next_opcode; } err = PyObject_IsTrue(w); Py_DECREF(w); if (err > 0) err = 0; else if (err == 0) JUMPTO(oparg); else break; continue; So technically these implementations are equivalent besides the fact that bool() is type rather than function. -- With best regards, Daniel Kluev -- http://mail.python.org/mailman/listinfo/python-list