私はちょうどこの質問に出くわしました。Pythonとの違い__str__と__repr__その主な目的は__repr__明確にすることであると述べました。しかし、の主な目的は、後でpythonオブジェクトを再構築できる__repr__ような文字列を生成することであると聞きました。eval()実際、主な目的は__repr__何ですか?Pythonの組み込み関数またはデフォルトモジュールは__repr__、オブジェクトを再構築するために本質的に使用しますか?__repr__常に定数文字列(「foo」など)を返すように上書きするだけでは、実行が混乱しますか?
2 に答える
リテラル表記(、、、、strなど)を持つ型の場合int、は型を再度作成するために使用できる文字列を返します。floatlistrepr()
それは素晴らしいことですが、必須ではありません。
の主な目的は、デバッグの目的で、開発者がここにどのオブジェクトを持っているかに関する明確な情報を開発者__repr__に提供することです。
__repr__ドキュメントからの引用:
repr()オブジェクトの「公式」文字列表現を計算するために組み込み関数によって呼び出されます。可能であれば、これは同じ値でオブジェクトを再作成するために使用できる有効なPython式のように見えるはずです(適切な環境が与えられた場合)。これが不可能な場合は、フォームの文字列を<...some useful description...>返す必要があります。
しかし何よりも:
これは通常、デバッグに使用されるため、表現が情報が豊富で明確であることが重要です。
強調鉱山。
カスタムタイプから定数文字列を返すことは、技術的には何も壊しませんが、開発者としての生活を難しくします。
慣例ではrepr、オブジェクトを表す文字列を取得し、それstrを説明するために使用します。通常の印刷のためreprに、デバッグのためにより多く使用されます。strreprの出力は、評価できるコードのように見えるものであり、多くの場合、そうです。ただし、それを信頼することはできません。オブジェクトを文字列に変換して戻す必要がある場合は、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)>'