こもろぐ @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

広告:本ブログで紹介している書籍等商品の紹介でAmazonアソシエイトを利用していることがあります。

おそらくは親切なUnicode文字列

一連のやりとりの後で,初めてのPythonを読み返してみると,こんな事が書いてあった.

Unicode文字列オブジェクトは,通常の文字列オブジェクトとは型が異なります.

えええ,というかクラスの章を読みした後だから気付いたのかな.型(クラス)自体が別なのか.いままで,特殊な変換を施した同じ型のオブジェクトのようなものと思いこんでました.
IDLEで検証

>>> hoge = 'hoge'
>>> fuga = unicode(hoge) # hogeオブジェクトをUnicode文字列に
>>> type(hoge) , type(hoge).__base__ # hoge オブジェクトのクラス, hoge オブジェクトのクラスのスーパークラス
(<type 'str'>, <type 'basestring'>)
>>> type(fuga),type(fuga).__base__ # 同様に fugaオブジェクト
(<type 'unicode'>, <type 'basestring'>)
>>> type(hoge).__base__ == type(fuga).__base__ , type(hoge).__base__ is type(fuga).__base__ # オブジェクトのスーパークラスが,同等か(==)と同値か(is)の検証
(True, True)
>>> type(hoge) == type(fuga) , type(hoge) is type(fuga) # もちろんクラスは異なるので, False.
(False, False)
>>> hoge == fuga , hoge is fuga # オブジェクトは同等か,同値((つまりメモリ上のアドレスが等しいかどうか))か.
(True, False)

最後の結果が面白い.異なる型のオブジェクトでも文字列の内容で同等かを判定してくれるのか…
というか,XML処理やtkinterのラベルでunicode文字列を要求されたりするけど,型チェックすることで,いらぬ文字化けを防いでくれる,ということなのか.どういう風に解釈すればいいのかよくわかりません.

継承関係などをまとめると

str クラスと unicode クラスはどちらとも basestring クラスのサブクラスである(共通の親をもつ).クラスは別モノである.