Oh 脳《143》続・ようこそ Python のトワイライトゾーンへ

記事一覧Oh 脳: after ZERO《其之佰肆拾参》

続・ようこそ Pythonトワイライトゾーンへ… (@,@)

《監修》小泉ひよ子とタマゴ倶楽部

セミナーの枕で紹介した小ネタ集です。息抜きや話題作りにどうぞ (^.^)

Python には、知る人ぞ知る、さまざまなトワイライトゾーンが存在します。

今回は、その続編として、次の話題を紹介(再掲)します。

(中略)

■ 発展課題

同じ値を持つ整数リテラルに対して、次のように、

>>> x, y = 256, 256
>>> x is y
True
>>> x, y = 257, 257
>>> x is y
False

複数の異なるオブジェクトが生成されることがあります。この状況は、Python のバージョンの違い、また Jython/IronPython でも異なります。そこで、この境界値(ここでは 256,257)を検出するプログラムを作成してください。


《hint》Jython2.5 では、次のように、

>>> x = 899
>>> y = 899
>>> x is y
True
>>> x = 900
>>> y = 900
>>> x is y
False

その境界値(ここでは 899,900)が、Python3.1 とは異なります。

《note》詳細は、中級編「ソースコードの歩き方」で解説します。


(中略)

lambda 式は、名前を持たない関数オブジェクトを参照する、直接的な手段を提供します。式は(lambda 式に限らず)リテラル表現に代えて、オブジェクトを参照する手段のひとつを提供します。例えば、

>>> id(7)
3483872
>>> id(3+4)
3483872

リテラル表現 7 と式 3+4 とは、どちらも同じ「整数」オブジェクト 7(id:3483872)を参照します。このように、オブジェクトを参照(表現)するには、次の3つの手段があります。

《oops》Python3.1 の隘路
>>> 3.__add__(4)    # (x.x) ... too bad
SyntaxError: invalid syntax (, line 1)
>>> 3.0.__add__(4)
7.0

>>> n = 3
>>> id(n.__add__(4))
3483872

残念ながら、Python3.1 では、リテラル表現(整数オブジェクト)に対するメソッド呼び出しは、構文規則に違反すると見なされ、例外 SyntaxError を生成します。リテラル表現(実数オブジェクト)に対するメソッド呼び出しは有効です。この問題を解消するために変数を利用できますが、他の「純粋な OOP 言語」と肩を並べるために、Python が越えなければならない壁のひとつかもしれません。

Python 理解度チェック #03: リテラルに対するメソッド呼び出し《問題篇》

変数を利用せずに、整数オブジェクトに対するメソッド呼び出しを有効にするには、どうすればいいでしょうか。


《hint》SyntaxError とは、何を意味するのでしょうか。

>>> 3..__add__(4)
7.0

Last updated♪2009/12/21