次のようなバイト文字列を処理または提示する必要がある場合があります。
bob2='bob\xf0\xa4\xad\xa2'
これを(Ubuntuで)印刷すると、次のようになります
In [62]: print(bob2)
bob
これは、バイト文字列を理解しようとしている他の人にとってはあまり役に立ちません。print(bob2)
コメントの中で、John は、Windows ではのような結果になると指摘していますbobð¤¢
。問題は、Python が端末/コンソールのデフォルトのエンコーディングを検出し、そのエンコーディングに従ってバイト文字列をデコードしようとすることです。Ubuntu と Windows は異なるデフォルト エンコーディングを使用するため (おそらくutf-8
とcp1252
それぞれ)、異なる結果が得られます。
対照的に、文字列の repr は明確です。
In [63]: print(repr(bob2))
'bob\xf0\xa4\xad\xa2'
SO に Python 文字列に関する質問を投稿すると、多くの場合、文字列の表現を表示するように求められるため、どの文字列を扱っているかがわかります。
一般に、repr は、オブジェクトの明確な文字列表現である必要があります。repr(obj)
objectobj
の__repr__
メソッドを呼び出します。あなたの例では、クラスにA
は独自の__repr__
メソッドがないrepr(b)
ため、クラスとメモリアドレスを示すことに頼っています。
メソッドをオーバーライドし__repr__
て、より関連性の高い情報を提供できます。
あなたの例では、 '<__main__.A instance at 0x74d78>'
2つの有用なことを教えてくれます:
- それは
名前空間
b
のクラスのインスタンスでありA
、__main__
- オブジェクトがメモリ内のアドレス 0x74d78 に存在すること。
たとえば、 class のインスタンスが 2 つあるとしますA
。それらが同じメモリアドレスを持っている場合、それらが同じ基になるオブジェクトを「指している」ことがわかります。(この情報は を使用して取得することもできますid
)。