質問
私は読んでいます repr
Pythonで。の出力の適用は何だと思っていました repr
は。例えば
class A:
pass
repr(A) ='<class __main__.A at 0x6f570>'
b=A()
repr(b) = '<__main__.A instance at 0x74d78>'
いつ興味がありますか '<class __main__.A at 0x6f570>'
また'<__main__.A instance at 0x74d78>'
?
解決
時々あなたは対処しなければなりません バイト文字列を提示します そのような
bob2='bob\xf0\xa4\xad\xa2'
(ubuntuで)これを印刷すると、
In [62]: print(bob2)
bob𤭢
これは、バイト文字列を理解しようとしている他の人にとってはあまり役に立ちません。コメントで、ジョンはWindowsで、 print(bob2)
のようなものになります bobð¤¢
. 。問題は、Pythonが端末/コンソールのデフォルトエンコードを検出し、そのエンコードに従ってバイト文字列をデコードしようとすることです。 UbuntuとWindowsは異なるデフォルトエンコーディングを使用しているため(おそらく utf-8
と cp1252
それぞれ)、さまざまな結果が続きます。
対照的に、文字列の繰り返しは明確です。
In [63]: print(repr(bob2))
'bob\xf0\xa4\xad\xa2'
Python文字列について質問すると、人々がここに質問を投稿すると、弦のreprを表示するように求められることがよくあります。
一般に、REPはオブジェクトの明確な文字列表現である必要があります。 repr(obj)
オブジェクトを呼び出します obj
's __repr__
方法。あなたの例ではクラスのためです A
独自のものがありません __repr__
方法、 repr(b)
クラスとメモリのアドレスを示すことに頼ります。
オーバーライドできます __repr__
より関連性の高い情報を提供する方法。
あなたの例では、 '<__main__.A instance at 0x74d78>'
2つの便利なことを教えてください:
- それ
b
クラスのインスタンスですA
の中に__main__
名前空間、 - また、オブジェクトはアドレス0x74D78のメモリにあること。
たとえば、クラスの2つのインスタンスがある場合があります A
. 。彼らが同じメモリアドレスを持っている場合、あなたは彼らが同じ基礎となるオブジェクトを「指している」ことを知っているでしょう。 (この情報も使用して取得できることに注意してください id
).
他のヒント
理論的には、 repr(obj)
それが供給されるように、文字列を吐き出すべきです eval
オブジェクトを再作成します。言い換えると、
obj2 = eval(repr(obj1))
オブジェクトを再現する必要があります。
実際には、 repr
多くの場合、「ライト」バージョンです str
. str
人間の読み取り可能な形式のオブジェクトを印刷するかもしれませんが、 repr
通常はデバッグの目的で、オブジェクトのクラスのような情報を印刷します。しかし、有用性はあなたの状況と問題のオブジェクトがどのように処理するかに大きく依存します repr
.
の主な目的 repr()
インタラクティブなインタープリターとデバッガーで使用されて、人間が読みやすい形式でオブジェクトをフォーマットすることです。あなたが与えた例は、主にデバッグの目的に役立ちます。