文字列のフォーマット format() を使ってみたメモ

//編集中 2012/12/05 追記
//formatで変数の展開、kw,list,辞書,変数を*で展開、**で展開、について触れる。
//第6回 Pythonicな文字列フォーマットforamat()メソッド http://gihyo.jp/dev/serial/01/pythonhacks/0006


文字列出力のpythonicな方法
これまでは、C-likeな使い方。「print "%d %s" % (10, "hoge")」 みたいな。
%演算子を使うに当たってPython以外の知識を覚えなければならない。
辞書のキーを指定した埋め込みではまったく違う表記を使うなど,アドホックな仕様もあった。

format()は、pythonの記法に近い方法で、C由来の方法を置きかえる目的で追加された。
PEP 3101 -- Advanced String Formattingとして記載(ver.2.6で追加された)
なので、%記法は近い将来廃止予定(非推奨)
一応3.2ではsupportはまだされている。

#! /usr/bin/env python                                                                                                                                                          
# -*- coding: utf-8 -*-                                                                                                                                                         

#--------------------------------------                                                                                                                                         
# これまでのやりかた(Cのやりかたを踏襲)                                                                                                                                         
#--------------------------------------                                                                                                                                         
# タプル渡し                                                                                                                                                                    
print "%d %d %s" % (1, 3, "unpopo")

# 辞書渡し                                                                                                                                                                      
hoge="HOGE"
print "%(hoge)s" % locals()
print "%(fuga)s" % {"fuga":"FUGA"}

#exit()                                                                                                                                                                         
#---------------------                                                                                                                                                          
# formatを使ったやり方                                                                                                                                                          
#---------------------                                                                                                                                                          
# formatとは、文字列のmethodでこんな感じで使える。                                                                                                                              
print "{0} {1} {2}".format("unpopo", 12345, "popopo-")

# <基礎編>                                                                                                                                                                      
# (1-1)リスト渡し: {N}(Nは整数,0オリジン)でformatの要素を表示する                                                                                                               
# Index指定で、要素の順番を入れ替えられる                                                                                                                                       
fmt_list1 = "list-1 {0} {1} {2} {3}"
ret = fmt_list1.format( 0, 10, 20, 30 )
print ret

fmt_list2 = "list-2 {0} {3} {1} {2}"
ret = fmt_list2.format( 0, 10, 20, 30 )
print ret

# *を指定するとリスト展開後の要素にアクセスできる(他の関数と同様)                                                                                                               
l1  = [0, 10, 20, 30]
ret = fmt_list2.format(*l1)
print ret

# {N[key]}で辞書の要素にアクセスできる                                                                                                                                          
d1 = {'x':"xxx", 'y':"yyy"}
fmt_list3 = "list-3 {0[x]} {0[y]}"
ret = fmt_list3.format( d1 )
print ret



print "------------"
#exit()                                                                                                                                                                         
# (1-2)K/W渡し: {key} でformatに渡したキーワードを展開して表示する                                                                                                              

fmt_dict1 = "dict-1 {hoge} {moge} {hoge}"
ret = fmt_dict1.format( hoge="hogehoge", moge=12345 )
print ret

# {key[key]}で辞書の要素にアクセスできる                                                                                                                                        
d2 = {'a':"aaa", 'b':"bbb"}
fmt_dict2 = "dict-2 {hoge[a]} {hoge[b]}"
ret = fmt_dict2.format( hoge=d2 )
print ret

# **を指定するとK/W展開後の要素にアクセスできる(他の関数と同様)                                                                                                                 
fmt_dict3 = "dict-3 {a} {b}"
ret = fmt_dict3.format( **d2 )
print ret

#exit()                                                                                                                                                                         
print "------------"
# (1-3)オブジェクト渡し: クラスオブジェクトや、モジュールを渡して、                                                                                                             
#                      "."で指定して要素にアクセスさせる                                                                                                                        
class Unpopo(object):
    def __init__(self, l, m, n):
        self.l = l
        self.m = m
        self.n = n
u1 = Unpopo("abc",123,"xyz")
fmt_obj1 = "{0.l} {0.m} {0.n}"
ret = fmt_obj1.format( u1 )
print ret

fmt_obj2 = "{unpopo.l} {unpopo.m} {unpopo.n}"
ret = fmt_obj2.format( unpopo=u1 )
print ret


fmt_obj3 = "python version: {0.version}"
import sys
ret = fmt_obj3.format( sys )
print ret

print "------------"
# (2-1) フォーマットコントロール                                                                                                                                                
# 領域と、幅寄せ                                                                                                                                                                
print "{0:10} {1} {2:>20}".format("hogehoge","|","fugafuga")

# 他にもいろいろアルがそれはmanual参照