それは Python の暗黒面? Boolean が整数であることについて。

きっと「おぶじぇくとしこうまんせー」な人々にケチョられる Python のこの振る舞い。

こないだの「True = 5」とは別の話ね。

Python 2.3 ではじめて Boolean が追加されたその日から、これは「意図したものである」とされている:

Boolean 型はある。けれど整数演算出来る。
1 >>> True + 1
2 2
3 >>> False + 1
4 1
5 >>> False * 75
6 0
7 >>> True * 75
8 75

というか「Python では」あえてやろうと思ったことがなかったので、ついさっきはじめて知った。

これは C++ と同じノリで、Java では出来ない。Ruby はどうだったかしらと今これで確認してみたら、Ruby も(多分デフォルトではということと思うが)許してない。

この Python/C++ 流儀は異論や反感を持たれやすいのよね。特に Java のような「プログラマに優しい」(悪く言えばプログラマを甘やかして馬鹿にする)言語での「そんな間違ったコードを許すなんて」的な洗脳に侵されすぎていると。

あたしゃこの振る舞いには馴染みがある(C++プログラマでもありすから)し、別に不自然だとも思わない。この振る舞いがあるから、ないから、で劇的に何かが変わるもんでもないんだから、ヒトんちのことなんかほっとけばいいのに、と思うんだけれど、こういう「そんなことで間違うなんか10年で一度くらい」ほどの「過ちを犯しやすさ」を大袈裟に言い広めるのがね、いるから困る。実際 Boolean が整数に自動で拡張すると少しは便利よ。

1 >>> sum([True, False, True])
2 2

とか。あるいは NumPy なんかみたいな大規模な行列演算なんかでは、「真偽値としてストアしておいた情報」との積が一発で出来ないと実際かなり鬱陶しい。以下は「真偽値で記憶しておいたマスク」行列との積(アダマール積)の例:

 1 >>> import numpy as np
 2 >>> a = np.arange(10).reshape((5, 2))
 3 >>> m = np.array([True]*10, np.bool)
 4 >>> m[::3] = False
 5 >>> m = m.reshape((5, 2))
 6 >>> 
 7 >>> a
 8 array([[0, 1],
 9        [2, 3],
10        [4, 5],
11        [6, 7],
12        [8, 9]])
13 >>> m
14 array([[False,  True],
15        [ True, False],
16        [ True,  True],
17        [False,  True],
18        [ True, False]], dtype=bool)
19 >>> a * m  # 内積ではなく element-wise な積(アダマール積)
20 array([[0, 1],
21        [2, 0],
22        [4, 5],
23        [0, 7],
24        [8, 0]])

実用的な理由からこういったことが一発で出来ないとワタシならストレス満開の花を咲かせるところだが、「出来るなんて死ねやヲラ」派の人たちはこれをどう見るのであろうかね。(まぁ一個も逃げ道がない言語なんかよっぽどなので、どの言語でも「ひとひねり」入れれば出来るわけだけどね。)