[Python-Dev] PEP 285: Adding a bool type

Alex Martelli aleax@aleax.it
Sun, 31 Mar 2002 21:06:25 +0100


On Saturday 31 March 2002 9:45, Andrew Koenig wrote:
   ...
"""
Liskov substitutibility would seem to suggest deriving int from bool,
not the other way around.  That is: If I have a program that uses bool
values, I can change it so that it uses int values without affecting
the behavior of the program.  The reverse is not true.

I wonder if this is the circle-ellipse problem over again?
"""

I think not, because circle/ellipse, square/rectangle and bag-of-bananas/
bag-of-fruit are problems only under mutability.  If an object is immutable
(either because of general language rules -- a FP language, say -- or
because of specific considerations, such as a const reference in C++) you
CAN pass a reference to an immutable circle wherever a reference to
an immutable ellipse is expected (etc) and keep Liskov happy.

And Python numbers _are_ immutable... so I don't think the problem is
related to the well-known category you mention.

Python's int and the proposed bool can't satisfy Liskov anyway, either way, 
due to str and/or repr.  If I "know" that x is one of the proposed bool 
objects, I could "assert str(x).istitle()" (or repr(x).istitle(), depending 
on which function is meant to return 'True' and 'False') -- if x is an int, 
that fails.  If I know that x is an int, I can similarly asserts 
tr(x).isdigit() -- but if x is a bool, that fails.

[Some would say this is too strict a reading of Liskov for practical use... 
do you think it is?]

Apart from str and repr issues, I cannot find any assertion I can make
under the proposed PEP, that will work for any x that is an int, but breaks
if x is a bool.  So (net of str/repr issue), any instance of bool IS-A int,
so inheriting bool from int seems OK (net of str/repr issues).  OTOH, if I 
know that x is one of the proposed bool values, I can assert 0<=x<2, and 
that will fail in many cases if x is an int instead.  So, inheriting int 
from bool seems unwarranted.  Or, am I missing something?


Alex