検索
特集

2.4への機能強化で広がるPythonの世界UNIX USER2005年2月号特別企画より転載(3/4 ページ)

Pythonの最新版であるバージョン2.4が、2004年11月30日にリリースされた。この最新版では、新たにさまざまな構文・機能が追加されたのだが、その中でも整数型の統合、ジェネレータの生成構文、Templateによる文字列置換、関数やメソッドの修飾構文など、とくに便利なものをピックアップして解説していこう。

PC用表示 関連情報
Share
Tweet
LINE
Hatena

関数やメソッドの修飾構文

 関数やメソッドの修飾構文の機能向上は、Python 2.4の拡張のうち、目玉ともいえる部分です。この構文については開発者メーリングリストにおいて、長期間にわたって議論が繰り返されました。関数やメソッドに対する修飾機能そのものはPython 2.2から存在していましたが、専用の構文は用意されていませんでした。

 たとえば、クラスメソッドを定義する場合、従来はリスト1のように記述していました。この方法はクラスの記述が複雑になったり、メソッドのコード量が増えると、メソッドの定義部分とクラスメソッドとしての登録部分が離れてしまい、可読性が低下する問題がありました。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 Python 2.4では、「@」という記号を使って、メソッドを修飾する構文が提供され、リスト2のように書くことが可能になりました。この@を使った構文は、クラスメソッドを定義する場合以外にも、自由に使用できます。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 実行例12では、関数オブジェクトにcreatedTimeという属性を作成し、その値として、時刻を代入する修飾用の関数createdTimeを定義しています。関数fooとbarを定義する際にこの修飾を指定しています。結果として、それぞれの関数オブジェクトにはcreatedTimeという属性が作られ、それを参照すれば定義された時刻が分かります。このような関数を修飾する関数のことをデコレータといいます。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 ここで重要なのは、修飾用の関数が適用されるのは実行時ではなく、定義時である点です。つまり、デコレータによって複数の関数に共通したシグネチャを持たせる操作を簡単に記述できるようになったわけです。

 デコレータには引数を与えることもでき、これを利用するといろいろと面白いことができます。リスト3は関数の引数の型をチェックするデコレータの例です。実行結果は実行例13のようになり、正しく引数の型チェックが行われていることが分かります。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 また、この一連の動作はリスト4のようにコードを書いた場合とまったく同じです。リスト4で、print calcDistance(3.14, 1.592)を実行すると、実際に起動する関数本体はwrapper(*args, **kwargs)ということになります。wrapper関数の引数argsは(3.14, 1.592)になっています。この実引数がargTypesで与えられている型に対応しているかを順番にチェックし、すべて正しければ func(*args, **kwargs)が実行され、結果を返します。変数funcは、上位の関数checkArgumentsでオリジナルのcalcDistanceオブジェクトが代入されていますので、結果としてオリジナルのcalcDistance(3.14, 1.592)が実行されることになります。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 このような関数のカスタマイズは、従来も行えましたが、デコレータを使うことでさらに簡潔に記述できるようになったわけです。デコレータはこれ以外にも多くの利用法がありますので、研究してみると面白いと思います。

10進数演算モジュール

 Python 2.4から、10進数演算の機能を提供するDecimalモジュールが標準になりました。これで、1.1を10回足すと正しく11になる計算ができるようになりました(リスト5)。浮動小数点数による計算では、丸め誤差のため計算結果は11.0になりませんが、decimalを使った10進数計算では正しい結果が得られます。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

Copyright(c)2010 SOFTBANK Creative Inc. All rights reserved.

ページトップに戻る