🍎

Pythonのstrとrepr

2022/11/13に公開

自分用メモ

strとrepr

公式リファレンスによると、
https://docs.python.org/ja/3/reference/datamodel.html?highlight=repr#object.__str__
https://docs.python.org/ja/3/reference/datamodel.html?highlight=repr#object.__repr__
strは

オブジェクトの「非公式の (informal)」あるいは表示に適した文字列表現を計算するために、 str(object) と組み込み関数 format(), print() によって呼ばれます。戻り値は string オブジェクトでなければなりません。
__str__() が有効な Python 表現を返すことが期待されないという点で、このメソッドは object.__repr__() とは異なります: より便利な、または簡潔な表現を使用することができます。
組み込み型 object によって定義されたデフォルト実装は、 object.__repr__() を呼び出します。

reprは

repr() 組み込み関数によって呼び出され、オブジェクトを表す「公式の (official)」文字列を計算します。可能なら、これは (適切な環境が与えられれば) 同じ値のオブジェクトを再生成するのに使える、有効な Python 式のようなものであるべきです。できないなら、 <...some useful description...> 形式の文字列が返されるべきです。戻り値は文字列オブジェクトでなければなりません。クラスが __repr__() を定義していて __str__() は定義していなければ、そのクラスのインスタンスの「非公式の (informal)」文字列表現が要求されたときにも __repr__() が使われます。
この関数はデバッグの際によく用いられるので、たくさんの情報を含み、あいまいでないような表記にすることが重要です。

だそう。
つまり、

strはユーザーに見せる用
reprはコード内、デバッグで使う用

evalを実行すると、strはエラーを吐くがreprだとそのまま使える

text = repr("ringo")
text2 = "ringo"

print(eval(text))
print(eval(text2))
ringo
Traceback (most recent call last):
  File "C:\Users\name\sandbox\t.py", line 5, in <module>
    print(eval(text2))
  File "<string>", line 1, in <module>
NameError: name 'ringo' is not defined. Did you mean: 'range'?

なにか間違いがありましたらコメントください。

Discussion