web-dev-qa-db-ja.com

Pythonのrepr()関数について

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

言い換えると:

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

質問:

  1. repr(x)を実行するときに二重引用符を取得するのはなぜですか? (str(x)を実行しても取得されません)
  2. オブジェクトであるxではなくeval("'foo'")を実行すると、なぜ'foo'を取得するのですか?
133
0101amt
>>> x = 'foo'
>>> x
'foo'

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

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

reprは、実際にxのマジックメソッド__repr__を呼び出します。これは、xに割り当てられた値'foo'の表現を含むstringを提供します。したがって、文字列'foo'内で""を返し、結果として"'foo'"になります。 reprの考え方は、インタープリターに入力し、reprの引数として送信されたのと同じ値を取得できる一連のシンボルを含むストリングを提供することです。

>>> 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'です。

154
ovgolovin

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

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

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

また、eval(repr(x)) == xの類推はリテラルを意味するものではないことに注意してください。これは近似値であり、ほとんどの(すべて?)組み込み型に当てはまりますが、主なことは、repr出力を調べることで、型と論理的な「値」についてかなり良いアイデアを得ることです。

9
user395760

1)repr('foo')の結果はstring'foo'です。 Pythonシェルでは、式の結果も表現として表現されるため、基本的にrepr(repr('foo'))が表示されます。

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

x = 'foo'
y = x

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

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

3
phihag

あなたが言う時

foo = 'bar'
baz(foo)

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

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()は日付オブジェクトの公式表現を示していることがわかります。

2
Tanim_113