[Python-ideas] 1 + True = 2

Terry Reedy tjreedy at udel.edu
Sun Jun 5 21:20:23 EDT 2016


On 6/5/2016 2:37 PM, Giampaolo Rodola' wrote:
>
> On Sun, Jun 5, 2016 at 7:23 PM, Steven D'Aprano
> <steve at pearwood.info
> <mailto:steve at pearwood.info>> wrote:
>
>     On Sun, Jun 05, 2016 at 06:37:48PM +0200, Giampaolo Rodola' wrote:
>     > >>> 1 + True
>     > 2
>     > >>> 1 + False
>     > 1
>     > >>>
>     >
>     > I bumped into this today by accident and I can't recall ever being aware of
>     > this. Why isn't this a TypeError in Python 3?
>
>     Because bool is a subclass of int, and has been since it was first
>     introduced back in Python 2.2. I'm not quite sure what your question is
>     about... are you asking what was the original justification for making
>     True and False equal to 1 and 0? If so, see the PEP:
>
>     https://www.python.org/dev/peps/pep-0285/
>
>     Or do you mean to ask why it wasn't changed in Python 3? Well, changed
>     to what? All the reasons given in the PEP still hold, and there's no
>     really compelling reason to make bool something else. Since bools aren't
>     broken, why change them?
>
>
> I've read through the PEP and I understand the rationale about why
> True/False is a subclass of int

'subclass of int' means 'instances are ints'

> What I find odd though is that a bool can be used in arithmetical
> operations as if it was the exact same thing as a number.

That is what subclass means.

 > I mean, to me this is just odd:
>
>>>> 1 + True
> 2
>
> I would have expected that to be treated the same as:
>
>>>> 1 + "1"
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> TypeError: unsupported operand type(s) for +: 'int' and 'str'

This would only be sensible if Bools were strings.

> On the other hand (and I'm gonna contradict myself with what I've just
> said above) on chapter 4:
> /
> /
> /       There's a small but vocal minority that would prefer to see/
> /       "textbook" bools that don't support arithmetic operations at/
> /       all, but most reviewers agree with me that bools should always/
> /       allow arithmetic operations./
>
> ...so maybe supporting arithmetical operations was also a primary
> intention,

For some people, yes.

> in which case my question is "why?".

Just a few days ago, I read someone, while discussing an fairly large 
application, saying how nice python is because it allows simple code like

score = sum(s==c for s, c in zip(student, correct))

(This is not the code from the application, but close enough.)  There is 
real code in the wild exploiting issubclass(bool, int), which could be 
broken if that were changed.

-- 
Terry Jan Reedy



More information about the Python-ideas mailing list