こんにちは。ちょっと期間が空いてしまいましたが、今日も頑張る。
○読んでいる本
以下の本を勉強がてら読んでいます。
ここにある通り、Pythonプログラムを改良する59項目が掲載されています。詳細は本に書かれているので、それを読めば良しとして、大事そうなところと、これに関連して勉強したことを書きます。
まとめページは以下より。
さて、今回は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で実行しようとすると大抵このエラーが出てきてため息つく笑)
それでは今日はこんな感じで。