St_Hakky’s blog

Data Science / Human Resources / Web Applicationについて書きます

Effective python シリーズ3:Know the Differences Between "bytes", "str", and "unicode"

こんにちは。ちょっと期間が空いてしまいましたが、今日も頑張る。

○読んでいる本

以下の本を勉強がてら読んでいます。

www.effectivepython.com

ここにある通り、Pythonプログラムを改良する59項目が掲載されています。詳細は本に書かれているので、それを読めば良しとして、大事そうなところと、これに関連して勉強したことを書きます。

まとめページは以下より。

st-hakky.hatenablog.com


さて、今回は3つ目:「Know the Differences Between "bytes", "str", and "unicode"」をやります。

○Know the Differences Between "bytes", "str", and "unicode"

Python2と3で大きく違い、混乱するこの文字列の表し方。表にまとめると以下のようになります。

文字列の表し方 8ビット値を含むもの Unicode文字を含むもの
Python2 str, unicodeの2種類 strインスタンス unicodeインスタンス
Python3 bytes, strの2種類 bytesインスタンス strインスタンス
Python2 Python3
byte型 str("") bytes(b"")
通常の文字列 str ('') str ('')
unicode文字列 unicode(u"") str ('')

2系から3系に移った際に、3系で文字列は全てunicode型で扱われるようになったので、このあたりはいい感じになったのですが、まぁわかりにくいですよね笑(もう3系だけ覚えればいいんじゃね笑)。

■とにかく覚えること

以下の3つを覚えればおけ。

  • インターフェースの一番外側の境界線で、Unicodeの符号化と復号化をして、プログラムの内部ではUnicode型を使うようにする
  • プログラムの核心部分では兎にも角にもUnicode文字型(2系:unicode、3系:str)を使う
  • 絶対にプログラム内部で文字の符号化うんちゃらを考えないこと

つまり、Unicode型(2系ならunicode、3系ならstr)を黙って使えば問題なし笑。

■3系でのstr(つまりunicode)とbytesの行き来

重要なこととして、2系と3系は共通してunicodeインスタンスがバイナリ符号化を伴っていないので、例えばバイナリに変換したい時(UTF-8符号化など)には、encodeメソッドを使わないといけませんし、逆にバイナリデータをunicode文字に変換したい時にはdecodeメソッドを使う必要があります。

私は基本的に3系を使うので、3系だけメモ。

  • encode => str→bytes
  • decode => bytes→str

参考:

■型を判定して一定の型を返す時に使うためのヘルパー関数

これはすごい便利ですね。以下に乗っています。

effectivepython/item_03.py at master · bslatkin/effectivepython · GitHub

■その他

この本の中身を理解するにあたって、以下の情報は役に立った(参考情報も含めて)。

Python3系が内部でunicode型のみを扱っているので、外に出力する際にbytesに変換したい場合はそうする必要があるので、Python3系ではこれをencodingって引数を持って、自動でやってくれているということも大事ですね(macで書いたコードをwindowsで実行しようとすると大抵このエラーが出てきてため息つく笑)

それでは今日はこんな感じで。