私はちょうどこの質問に出くわしました。Pythonとの違い__str__
と__repr__
その主な目的は__repr__
明確にすることであると述べました。しかし、の主な目的は、後でpythonオブジェクトを再構築できる__repr__
ような文字列を生成することであると聞きました。eval()
実際、主な目的は__repr__
何ですか?Pythonの組み込み関数またはデフォルトモジュールは__repr__
、オブジェクトを再構築するために本質的に使用しますか?__repr__
常に定数文字列(「foo」など)を返すように上書きするだけでは、実行が混乱しますか?
2 に答える
リテラル表記(、、、、str
など)を持つ型の場合int
、は型を再度作成するために使用できる文字列を返します。float
list
repr()
それは素晴らしいことですが、必須ではありません。
の主な目的は、デバッグの目的で、開発者がここにどのオブジェクトを持っているかに関する明確な情報を開発者__repr__
に提供することです。
__repr__
ドキュメントからの引用:
repr()
オブジェクトの「公式」文字列表現を計算するために組み込み関数によって呼び出されます。可能であれば、これは同じ値でオブジェクトを再作成するために使用できる有効なPython式のように見えるはずです(適切な環境が与えられた場合)。これが不可能な場合は、フォームの文字列を<...some useful description...>
返す必要があります。
しかし何よりも:
これは通常、デバッグに使用されるため、表現が情報が豊富で明確であることが重要です。
強調鉱山。
カスタムタイプから定数文字列を返すことは、技術的には何も壊しませんが、開発者としての生活を難しくします。
慣例ではrepr
、オブジェクトを表す文字列を取得し、それstr
を説明するために使用します。通常の印刷のためrepr
に、デバッグのためにより多く使用されます。str
reprの出力は、評価できるコードのように見えるものであり、多くの場合、そうです。ただし、それを信頼することはできません。オブジェクトを文字列に変換して戻す必要がある場合は、pickle
またはを使用しますjson
。
例えば:
>>> greeting = "Hello"
>>> print str(greeting)
Hello
>>> print repr(greeting)
'Hello'
独自のクラスを作成していて、それが非常に単純な場合は、評価できるものを__repr__
返すことができます。
class Song(object):
def __init__(self, title, artist):
self.title = title
self.artist = artist
def __repr__(self):
return "Song(%r, %r)" % (self.title, self.artist)
def __str__(self):
return "%s - %s" % (self.artist, self.title)
タイトルとアーティストの%r
取得に使用する方法に注意してください。repr
これにより、(Pythonの場合)エスケープとクォートが自動的にrepr(a_song)
処理され、デバッグ以外では実行しませんが、の結果を評価できます。ここでも、str
ユーザーに印刷するものを返しますrepr
。これは、デバッグに役立つものです。クラスがこれよりも複雑になると、から完全または評価可能なものを返すことができなくなりますrepr
。ここでの規則は、インスタンスを識別するための簡潔な文字列を返すことです。通常は角かっこで囲みます。
>>> repr(type(None))
"<type 'NoneType'>"
>>> import gtk
>>> win = gtk.Window()
>>> repr(win)
'<gtk.Window object at 0x10de45690 (GtkWindow at 0x7fdd89240000)>'