unicode型だったら、自動的にエンコードして出力するメソッドを作った

Pythonを使ったCGIを作るに際して、プログラムの内部ではunicode型を使い、出力時にはUTF-8に変換するということをしているのですが、今まではWebで検索して見付けたやりかた:

sys.stdout = codecs.lookup('utf-8')[-1](sys.stdout)

を使っていました(See also d:id:imait:20090203:1233673369)。

ですが、もし将来的に画像などのデータをCGI経由で出力したくなったりした時に、これでは困るのではないだろうか、そういう懸念がありまして、なんとかしたいと思ってきました。なので、なんとかしてみました。

どのようにしたかというと、HTMLクラスに新しくメソッドを用意しました。

def printe(self, value):
    if isinstance(value, unicode):
        print(value.encode(self.encode))
    else:
        print(value)

エンコードしてプリントするのでprinteメソッド。やることは非常に単純で、わたされたデータがunicode型なら、HTMLクラスのインスタンスを生成する際に指定した文字コードエンコードしてprint、その他の型ならそのままprint。printeメソッドを使うことで、出力時の文字コード云々を意識しなくてすむようになる。なるかな?

これをクラスメソッドにしなかったのは、いったいどの文字コードエンコードするか、いちいち指定しないといけなくなるから。だったら、こんな七面倒くさいことせずに、素直にエンコードしてやったほうがいい。

value = u'テスト'
print(value.encode('utf-8'))

これだと、なにやってるか一目でわかります。けど、これを少ない手数で書きたいと思ったから、printeメソッドを作った。

import html

sitetitele = u'サイトタイトル'
ht = html.HTML(encode=u'utf-8', lang=u'ja', sitetitle=sitetitle)
value = u'テスト'
ht.printe(value)

きっとたくさんprintすることになるから、この方がいいかな、なんて思うんですね。