(True + True) == 2
(sorry, one of my few pet-peeves after it bit me one time) (True + True) == 2
(sorry, one of my few pet-peeves after it bit me one time) >>> issubclass(bool, int)
True
>>> isinstance(True, int)
True
>>> int(True)
1
>>> int(False)
0
>>> True == 1
True
>>> False == 0
TrueIt's just like Duck Typing- you're trading the need to explicitly specify an interface for the potential dangers of letting your interpreter "know what you mean".
If this is frequently a problem, well... there are a lot of strongly-typed languages out there waiting for you to give them a try.
Not in this case. In this case it results from:
1. Python historically not having booleans and using 0 and 1 instead
2. As a result, `bool` inherits from `int` for compatibility reasons
>>> issubclass(bool, int)
True
with False mapping to 0 and True to 1 for compatibility purposes >>> int(False), int(True)
(0, 1)
3. Add isn't overridden on bool >>> bool.__add__
<slot wrapper '__add__' of 'int' objects>
therefore, when adding two booleans you're really adding two integers.Most non-strongly-typed languages will not have the following behavior
>>> "foo" + 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objectsIn that sense, Python is a very strongly typed language: from the top of my head, the only example of implicit type conversion in Python is the promotion of `int` to `long`, which has been removed from 3.x (all integer types were unified). All other conversions have to be explicit as far as I remember. That makes Python more strongly (but less statically) typed than Java (see the very strange overloading of the `+` operator when any operand is a string, as well as autoboxing since 1.5) and C# (C# allows for implicit type conversions, including in userland, and the cast operator doubles up as an explicit type conversion operator which I find terrible)
So no, it does not have a use :)
You can check if two out of three are true with
(bool1 + bool2 + bool3) >= 2
You can do
count_negatives = sum(number < 0 for number in numbers)
Sounds kinda like I'm making the same argument as Knuth in forcing '[]' over '()'.
True + True == False
might be a common interpretation. 1
+ 1
----
0