質問

私は読んでいます 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-8cp1252 それぞれ)、さまざまな結果が続きます。

対照的に、文字列の繰り返しは明確です。

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つの便利なことを教えてください:

  1. それ b クラスのインスタンスです Aの中に __main__名前空間、
  2. また、オブジェクトはアドレス0x74D78のメモリにあること。

たとえば、クラスの2つのインスタンスがある場合があります A. 。彼らが同じメモリアドレスを持っている場合、あなたは彼らが同じ基礎となるオブジェクトを「指している」ことを知っているでしょう。 (この情報も使用して取得できることに注意してください id).

他のヒント

理論的には、 repr(obj) それが供給されるように、文字列を吐き出すべきです eval オブジェクトを再作成します。言い換えると、

obj2 = eval(repr(obj1))

オブジェクトを再現する必要があります。

実際には、 repr 多くの場合、「ライト」バージョンです str. str 人間の読み取り可能な形式のオブジェクトを印刷するかもしれませんが、 repr 通常はデバッグの目的で、オブジェクトのクラスのような情報を印刷します。しかし、有用性はあなたの状況と問題のオブジェクトがどのように処理するかに大きく依存します repr.

の主な目的 repr() インタラクティブなインタープリターとデバッガーで使用されて、人間が読みやすい形式でオブジェクトをフォーマットすることです。あなたが与えた例は、主にデバッグの目的に役立ちます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top