Pythonのrepr()関数について


152

repr():オブジェクトの評価可能な文字列表現(「eval()」を実行できます。つまり、Pythonオブジェクトに評価される文字列表現です)

言い換えると:

>>> x = 'foo'
>>> repr(x)
"'foo'"

質問:

  1. 二重引用符を取得するのはなぜrepr(x)ですか?(私はそれらを取得しませんstr(x)
  2. オブジェクトであるxではなく'foo'、実行すると取得されるのはなぜeval("'foo'")ですか?

回答:


166
>>> x = 'foo'
>>> x
'foo'

したがって、名前x'foo'文字列に付加されます。たとえばを呼び出すとrepr(x)、インタープリターはの'foo'代わりにput をx呼び出し、次にを呼び出しますrepr('foo')

>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"

repr実際にの魔法のメソッド__repr__を呼び出しますx。これは、に割り当てられた値の表現を含む文字列を提供します。そのため、結果として文字列内に戻ります。のアイデアは、インタプリタに入力できる一連のシンボルを含む文字列を与え、引数として送信されたのと同じ値を取得することです。'foo'x'foo'"""'foo'"reprrepr

>>> eval("'foo'")
'foo'

を呼び出すとeval("'foo'")'foo'インタープリターに入力するのと同じになります。それ""は、インタプリタで外側の文字列の内容を直接入力するためです。

>>> eval('foo')

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    eval('foo')
  File "<string>", line 1, in <module>
NameError: name 'foo' is not defined

を呼び出すとeval('foo')fooインタプリタに入力するのと同じになります。ただしfoo、使用可能な変数はなく、例外が発生します。

>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>> 

strオブジェクトの単なる文字列表現です(x変数はを参照すること'foo'に注意してください)。したがって、この関数は文字列を返します。

>>> str(5)
'5'

整数の文字列表現は5です'5'

>>> str('foo')
'foo'

そして、文字列の文字列表現は'foo'同じ文字列'foo'です。


repr関数を使用する必要がある場合の使用例も教えてください。私はそれを理解することができません
gaurav parashar

14

インタラクティブインタープリターで得られるフィードバックも使用しreprます。式を入力すると(そうするexpr)、インタプリタは基本的にそうしresult = expr; if result is not None: print repr(result)ます。したがって、例の2行目で、文字列fooを目的の表現('foo')にフォーマットしています。そして、インタプリタは、作成reprのesentation それを二重引用符であなたを残して、。

%rを二重引用符と単一引用符のエスケープと組み合わせて出力すると、.pyファイルに書き込む方法で印刷されますが、見たい方法では印刷されないのはなぜですか?

ここで何を求めているのかわかりません。をsingle ' and double " quotes実行するとrepr、テキストには1種類の引用符のエスケープが含まれます。もちろんそうですが、そうでなければ、Pythonルールによる有効な文字列リテラルではありません。それはまさにあなたがを呼ぶことによって求めたものですrepr

また、このeval(repr(x)) == x類推は文字通りではないことに注意してください。これは概算であり、ほとんど(すべて?)の組み込み型に当てはまりますが、主なことは、repr出力を見ると、型と論理的な「値」についてかなり良いアイデアが得られるということです。


2
元々、それは実際はリテラルであること意図されていました:すべての値は、等しい値を生成するためreprに渡されるeval(またはソースコードにコピーして貼り付けられる)ものか、それを試行したときにSyntaxErrorを発生させるもののいずれかである必要があります(通常<…>によって生成スタイルobject.__repr__)。それは年々徐々に落ち着いてきました、そして2.7と3.xでそれはちょうど「多くのタイプに対して」真実であり、そしてstdlibでさえ例外があります(例えば、namedtupleローカルとして作成されたタイプはreprあなたにあなたに与えることができます ' t eval)、しかしそれは元のアイデアでした。
abarnert

7

str()はエンドユーザー向けの出力を作成するために使用され、repr()はデバッグ開発に使用されます。そして、それはオブジェクトの公式を表します。

例:

>>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2018-04-08 18:00:15.178404'
>>> repr(today)
'datetime.datetime(2018, 4, 8, 18, 3, 21, 167886)'

出力から、repr()が日付オブジェクトの公式表現を示していることがわかります。


3

1)の結果repr('foo')文字列 'foo'です。Pythonシェルでは、式の結果も表現として表現されるので、本質的にはですrepr(repr('foo'))

2)eval式の結果を計算します。結果は常に(数値、文字列、オブジェクトなど)です。次のように、複数の変数が同じ値を参照できます。

x = 'foo'
y = x

xとyは同じ値を参照するようになりました。

3)私はあなたがここで何を意味しているのか分かりません。例を投稿できますか、そして何を見たいですか?


1

あなたが言う時

foo = 'bar'
baz(foo)

関数に渡っfooていませんbazfooは値を表すために使用される単なる名前です(この場合'bar'は)baz。その値は関数に渡されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.