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 で実行したんですが、既に解消されてる問題だったりしたら誰か教えていただけると嬉しいです。