[Python-Dev] 3-way result of PyObject_IsTrue() considered PITA

Guido van Rossum guido@python.org
Wed, 16 Apr 2003 09:40:53 -0400

> The docs for PyObject_IsTrue() promise that the "function 
> always succeeds".  But in reality it can return an error 
> result if an underlying method returns an error.

Then the docs need to be repaired!

> The calls in ceval.c and elsewhere are cluttered and slowed
> by trying to handle all three possibilities.  In other places
> (like bltinmodule.c and pyexpat.c), the result is used directly
> in an "if(result)" clause that ignores the possibility of an
> error return.

Code that ignores the error return possibility is an accident waiting
to happen and should be fixed.

> Instead of fixing the docs, do you guys think there may
> be merit in returning False whenever explicit Truth isn't 
> found?  Favoring practicality over silent error passage?

-1000.  This function may invoke arbitrary Python code; exceptions in
such code should never be silenced.

> This would simplify the use of the function, honor the
> promise in the docs, and match usage in code that had not 
> considered an error result. The function and its callers will 
> end-up a little smaller, a little faster, and a little more consistent.
> Also, reasoning about truth values will be a tad simpler.
> Note, similar thoughts also apply to PyObject_Not().

And a ditto response.

Background: once upon a time the code honored the docs.  This was way
long ago, when comparisons also were not allowed to fail.  This was
found out to be a real bad idea when these operations could be
overloaded in Python, and gradually most code was fixed.
Unfortunately the docs weren't fixed. :-(

--Guido van Rossum (home page: http://www.python.org/~guido/)