Python の処理で気になる事があったので考察してみた

今日 Twitter 上で気になる発言があったので調べてみました。

どうも 1.__add__(n)__ した時に通らないとの事。
確かに試したところエラーが返ってくる。

Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 1.__add__(1)
  File "<stdin>", line 1
    1.__add__(1)
            ^
SyntaxError: invalid syntax

でもタプル ( ) を使うと通るらしい。
やってみました。

>>> (1).__add__(1)
2

クラスがどうなってるのか気になったので試してみました。

>>> 1.__class__
  File "<stdin>", line 1
    1.__class__
              ^
SyntaxError: invalid syntax
>>> (1).__class__
<type 'int'>
>>> i = 1
>>> i.__class__
<type 'int'>
>>> "i".__class__
<type 'str'>

まぁそうなりますよね。

うーんなんでだ。
最初 Ruby を思い浮かべて確か Ruby では出来たはずと思い実行してみました。

>> 1.class
=> Fixnum
>> 1.0.class
=> Float

ちゃんと通ってる。
この違いは何だろうと思って最初に考えたのは数値をオブジェクトとして扱っているかどうかでした。
でもすぐに Python もオブジェクトとして扱ってたはずと思い、考え直す事に。

似たような事を考えた人がいないか簡単に検索したもののでてこない。
なので色々試していると、ある事に気がつきました。
小数点の扱いです。
そういえば Python で小数点を試して無いじゃんってなったわけです。 じゃあやってみようってことでやってみました。

Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 1.0.__add__(1)
2.0

いけた。
なんと小数点は通るんですねぇ。驚きです。
因みにこんなのも通っちゃいます。

>>> 1..__add__(1)
2.0
>>> 1..__class__
<type 'float'>

要するに 1.__add__(n) の . は小数点と勘違いされてたって話なんですね。
それでエラーがでると。
小数点の他に . を付ける事で判別出来るようになったわけですか。なんと言う事でしょう。
うーん。謎は解明したんですが、 int 型を取るのにタプル ( ) なり変数に入れるなりしないといけないとは。
あんまり美しく無いですよね、これ。
なまじ float 型が通るだけに納得いきかねます。

ついでと言っては何ですが Ruby では .. と連続したものははじかれます。

>> 1..class
SyntaxError: compile error
(irb):1: syntax error, unexpected $end
	from (irb):1
	from :0

今回は Python 2.6.1 で実行したんですが、既に解消されてる問題だったりしたら誰か教えていただけると嬉しいです。