Python 3.0 Hacks

第6回Pythonicな文字列フォーマットforamat()メソッド

文字列操作は、Pythonのようなスクリプト言語の「主戦場」と言えます。Web開発に限らず、バイオインフォマティクスなど幅広い分野で盛んに活用される機能です。中でも文字列のフォーマッティングは、よく使われる機能のひとつです。

Python 3.0では、従来からあった%演算子や、Templateクラスを使った文字列フォーマットに加えて、Pythonic(Python的)でより迷いの少ない文字列フォーマットの仕組みが追加されました。文字列型にformat()というメソッドが追加されたのです。この記事では、format()メソッドの活用方法や利点について解説します。

format()メソッド

Python 3.0では、文字列オブジェクトにformat()というメソッドが追加されました。このメソッドを使うと、テンプレート文字列を元にした文字列のフォーマッティングが可能です。なお、このメソッドは2.x系にもバックポートされていて、2.6から同じように利用できます。

使い方はとてもシンプルです。メソッドを呼び出す対象となる文字列オブジェクトのformat()メソッドを呼び出します。メソッドには、文字列の内部に埋め込みたいオブジェクトを引数として指定します。メソッドを呼び出す文字列がテンプレートになります。波カッコ({~})で囲んだ部分に、引数として渡したオブジェクトを埋め込みます。

インタラクティブシェルで試してみましょう。この例では、波カッコの中に埋め込むオブジェクトのインデックスを指定しています。0という数値が複数ありますが、当然どちらにも0番目の引数が埋め込まれています。

リスト1
>>> "{0} {1} {0}".format('Spam', 'Ham')
'Spam Ham Spam'

「{foo}」のように波カッコの中に英数字を書き込むと、format()メソッドに渡したキーワード引数をベースに置換を行います。

リスト2
>>> "{food1} {food2} {food1}".format(food1='Spam', food2='Ham')
'Spam Ham Spam'

アトリビュート、辞書のキーを指定した埋め込みなど

もうひとつの例を試してみます。今度は、引数のアトリビュートを指定した埋め込みです。Pythonのアトリビュート表記と同様、インデックスを表す数値からドットを使ってアトリビュートを指定します。以下の例では、Pythonのバージョンを表示するために、sysモジュールのversionを埋め込んでいます。

リスト3
>>> import sys
>>> "Python version: {0.version}".format(sys)
3.0'

また、⁠{0[foo]}」のようにすると、引数として渡した辞書のキーを指定した置換を行います。角カッコ([~])の中に指定する辞書のキーには、クォーテーションが必要ないことに注意してください。角カッコの中の文字列が文字列として解釈され、辞書のキーに割り当てられた値を取り出して置換を行います。

波カッコの中にコロン(:)を置くと、置換する文字列のフォーマットをコントロールできます。次の例は、桁揃えを行うための指定方法です。桁揃えを行うためには、コロンの後に数値を指定します。

リスト4
>>> tmpl = "{0:10} {1:>8}"  # 0番目の要素を左寄せで、2番目の要素を右寄せで置換
>>> tmpl.format('Spam', 300)
'Spam            300'
>>> tmpl.format('Ham', 200)
'Ham             200'

このように、format()メソッドでは比較的シンプルで覚えやすいルールで、さまざまなプレースホルダを表記できるようになっています。条件分岐やループのような機能はありませんが、format()メソッドではかなり高度なテンプレーティングが行えるようになっています。

format()メソッドのメリット

旧来、Pythonで文字列のテンプレーティングを行うために「%」演算子が使われてきました。%演算子は便利ですが、いくつか問題もありました。まず、プレースホルダとして使われている「%d」のような文字列がC言語由来という点。Pythonistaは、%演算子を使うに当たってPython以外の知識を覚えなければなりません。また、辞書のキーを指定した埋め込みではまったく違う表記を使うなど、アドホックな仕様も目立ちます。

その点、format()メソッドではPythonの記法に近いプレースホルダが採用されています。表記も統一されていて、覚えることはずっと少なくて済みます。format()メソッドの方が、%演算子とくらべてよりPythonicだと言えます。

format()メソッドはこの演算子を置き換える目的があり追加された機能です。%演算子は、近い将来廃止されることが予告されています。

最後に1つ練習問題。以下の%演算子を使った文字列フォーマットと同じものを、format()メソッドを使って書いて下さい。3行目だけを書き換えて、format()メソッドを使って同じ出力を得ることができれば正解です。

リスト5
>>> from keyword import kwlist
>>> d={'language':'Python 3.0', 'keywords':len(kwlist)}
>>> "%(language)s has %(keywords)3d keywords" % d
'Python 3.0 has  33 keywords'

答えはご自分のブログに書くか、この記事のコメントとしてお寄せください。

おすすめ記事

記事・ニュース一覧