5

I have been reading about repr in Python. I was wondering what the application of the output of repr is. e.g.

class A:
 pass

repr(A) ='<class __main__.A at 0x6f570>'

b=A()
repr(b) = '<__main__.A instance at 0x74d78>'

When would one be interested in '<class __main__.A at 0x6f570>' or'<__main__.A instance at 0x74d78>'?

4

3 に答える 3

5

理論的には、オブジェクトを再作成するためrepr(obj)にフィードできるように文字列を吐き出す必要がevalあります。言い換えると、

obj2 = eval(repr(obj1))

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

実際にreprは、 の「ライト」バージョンであることがよくありstrます。通常はデバッグ目的で、オブジェクトのクラスなどの情報を出力しますstrreprしかし、有用性は、状況と問題のオブジェクトの処理方法に大きく依存しますrepr

于 2011-01-11T19:46:43.510 に答える
4

次のようなバイト文字列を処理または提示する必要がある場合があります。

bob2='bob\xf0\xa4\xad\xa2'

これを(Ubuntuで)印刷すると、次のようになります

In [62]: print(bob2)
bob

これは、バイト文字列を理解しようとしている他の人にとってはあまり役に立ちません。print(bob2)コメントの中で、John は、Windows ではのような結果になると指摘していますbob𤭢。問題は、Python が端末/コンソールのデフォルトのエンコーディングを検出し、そのエンコーディングに従ってバイト文字列をデコードしようとすることです。Ubuntu と Windows は異なるデフォルト エンコーディングを使用するため (おそらくutf-8cp1252それぞれ)、異なる結果が得られます。

対照的に、文字列の 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つの有用なことを教えてくれます:

  1. それは 名前空間bのクラスのインスタンスでありA__main__
  2. オブジェクトがメモリ内のアドレス 0x74d78 に存在すること。

たとえば、 class のインスタンスが 2 つあるとしますA。それらが同じメモリアドレスを持っている場合、それらが同じ基になるオブジェクトを「指している」ことがわかります。(この情報は を使用して取得することもできますid)。

于 2011-01-11T19:48:12.507 に答える
1

の主な目的はrepr()、対話型インタープリターとデバッガーでオブジェクトを人間が読める形式にフォーマットするために使用することです。あなたが示した例は、主にデバッグ目的に役立ちます。

于 2011-01-11T19:46:22.697 に答える