repr()
:オブジェクトの評価可能な文字列表現(「eval()」できます。つまり、Pythonオブジェクトに評価される文字列表現です)
言い換えると:
>>> x = 'foo'
>>> repr(x)
"'foo'"
質問:
repr(x)
を実行するときに二重引用符を取得するのはなぜですか? (str(x)
を実行しても取得されません)eval("'foo'")
を実行すると、なぜ'foo'
を取得するのですか?>>> 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'
です。
インタラクティブインタープリターで得られるフィードバックもrepr
を使用します。式を入力すると(expr
とする)、インタープリターは基本的にresult = expr; if result is not None: print repr(result)
を実行します。例の2行目is文字列foo
を希望する表現('foo'
)にフォーマットします。そして、インタープリターはthatのrepr
esentationを作成し、二重引用符を残します。
%rを二重引用符と単一引用符のエスケープと組み合わせて印刷すると、.pyファイルに書き込む方法で印刷されますが、見たくない方法で印刷されるのはなぜですか?
ここで何を求めているのかわかりません。テキストsingle ' and double " quotes
をrepr
で実行すると、1種類の引用符のエスケープが含まれます。もちろん、そうしなければ、Pythonルールによる有効な文字列リテラルにはなりません。 repr
を呼び出して、まさにそれを求めました。
また、eval(repr(x)) == x
の類推はリテラルを意味するものではないことに注意してください。これは近似値であり、ほとんどの(すべて?)組み込み型に当てはまりますが、主なことは、repr
出力を調べることで、型と論理的な「値」についてかなり良いアイデアを得ることです。
1)repr('foo')
の結果はstring'foo'
です。 Pythonシェルでは、式の結果も表現として表現されるため、基本的にrepr(repr('foo'))
が表示されます。
2)eval
は、式の結果を計算します。結果は常に値(数値、文字列、オブジェクトなど)です。次のように、複数の変数が同じ値を参照できます。
x = 'foo'
y = x
xとyは同じ値を参照するようになりました。
3)ここであなたが何を意味したのか分かりません。例を投稿して、何を見たいですか?
あなたが言う時
foo = 'bar'
baz(foo)
foo
をbaz
関数に渡していない。 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()は日付オブジェクトの公式表現を示していることがわかります。