オラ見てはいけねえものを見てしまっただぁ(False = 5、的な)

ゴー、ゴー、マッスル。

飛び散れ筋肉ビーム。

またもや What’s old より、しかもとんでもないもんを見つけてしまいましたとさ。

 1 Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win32
 2 Type "help", "copyright", "credits" or "license" for more information.
 3 >>> None = 1
 4   File "<stdin>", line 1
 5 SyntaxError: cannot assign to None
 6 >>> 1 == 2
 7 False
 8 >>> type(False)
 9 <type 'bool'>
10 >>> False = 5
11 >>> type(False)
12 <type 'int'>
13 >>> 

ぎぇぇ、知らんかった。Python 3 はオケ:

1 Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
2 Type "help", "copyright", "credits" or "license" for more information.
3 >>> None = 1
4   File "<stdin>", line 1
5 SyntaxError: can't assign to keyword
6 >>> False = 5
7   File "<stdin>", line 1
8 SyntaxError: can't assign to keyword
9 >>> 

これは Python 2.4 での変更「:const:`None` is now a constant; code that binds a new value to the name “None“ is now a syntax error.」からの話ね。

ちなみにこんなアホな仕様を擁護したいわけではないけれど、なんでこんなことになるのか、てのは説明出来る。要は「None がキーワードなのかそうでないのか」の話。None はついに 2.4 でキーワード扱いとなってコア言語に組み込まれたので直感に合う振る舞いをするようになった、と。で、そうでない True/False は実は「ただのシングルトンオブジェクト」、なのね。

なお、C/C++ ならこの手の話題には事欠かなくてな。たとえばブーリアンならこんなだよ:

  1. 昔々の初期の C、つい最近までの「俗称 ANSI C」(C89)まで「ブーリアン型」そのものがなかった。
  2. C++ ではかなり初期からブーリアンが導入されたので、bool、true、false が使えた。
  3. とはいえ C++ は「C と混ぜこぜで使う」ので、「C API」相手にすると「似非ブーリアン」との闘いとなっていた。
  4. 特に Windwos の COM に顕著だったが、「TRUE はゼロ」「FALSE は非ゼロ」流儀がかなり多かったこと。なぜなら API の戻りとして「唯一の絶対的に正しい振る舞いをしたぜ」シグナルとしての「0」、「それ以外の何かが起こったみたいだぜ」を「0以外」という無限集合を使って「その何かってのはこれだぜ」を示す慣習がむしろメジャーだったから。
  5. そして極めつけは「オレオレブーリアン祭り」なマクロがどこかしこで濫用され、C++ でコンパイル出来ない bool を自己定義する輩も多かった。
  6. C99 でようやくブーリアンが追加されたが、新し過ぎるのでまだあまり広く使われてない
  7. C++ で bool が使えようが使えまいが、「学習努力に欠ける」バカエンジニアが「おれおれブーリアンを撒き散らしていた」。

みたいな。Python もなんだかんだ C の子供だからねぇ。探せば結構あるよな。