小数点の表し方とメソッド呼び出し

第2回Python-FITで

dir(3)で調べると、3はrealというメソッドを持っている。しかし3.realはできない。なぜ?

という質問が出た。

確認してみると

>>> 3.real
  File "<stdin>", line 1
    3.real
         ^
SyntaxError: invalid syntax

確かにエラーだ。
その時自分も咄嗟には答えられなかったけど、書籍版Pyチュー第1版かなんかに

整数に.をつけると小数点として扱われる。

的なものを思い出した。そこで確認したら、

>>> type(3)
<type 'int'>
>>> type(3.)
<type 'float'>

となった。んで、float型がraalメソッドは持っているかということを確認したら、

>>> dir(3.)
['__abs__', '__add__', '__class__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__eq__', '__float__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getformat__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__int__', '__le__', '__long__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__nonzero__', '__pos__', '__pow__', '__radd__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rmod__', '__rmul__', '__rpow__', '__rsub__', '__rtruediv__', '__setattr__', '__setformat__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', 'as_integer_ratio', 'conjugate', 'fromhex', 'hex', 'imag', 'is_integer', 'real']

問題なくある様子。ということで上記の結果から導き出される事実は、

浮動小数点の表記間違ってるぞゴルァ

ということで怒られているんだろう。正しくは、

>>> int(3).real
3
>>> (3).real
3

2つ目は何をしているかと言うと、ただし()内の演算は行おうとして、何もせず整数の3を返し、realメソッドを呼び出す。という動作(多分

余談

Pythonだとこんなキモい表記が許されるようです。

>>> 3..real
3.0