回答:
>>> 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'"
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行目では、文字列foo
を目的の表現('foo'
)にフォーマットしています。そして、インタプリタは、作成repr
のesentation それを二重引用符であなたを残して、。
%rを二重引用符と単一引用符のエスケープと組み合わせて出力すると、.pyファイルに書き込む方法で印刷されますが、見たい方法では印刷されないのはなぜですか?
ここで何を求めているのかわかりません。をsingle ' and double " quotes
実行するとrepr
、テキストには1種類の引用符のエスケープが含まれます。もちろんそうですが、そうでなければ、Pythonルールによる有効な文字列リテラルではありません。それはまさにあなたがを呼ぶことによって求めたものですrepr
。
また、このeval(repr(x)) == x
類推は文字通りではないことに注意してください。これは概算であり、ほとんど(すべて?)の組み込み型に当てはまりますが、主なことは、repr
出力を見ると、型と論理的な「値」についてかなり良いアイデアが得られるということです。
repr
に渡されるeval
(またはソースコードにコピーして貼り付けられる)ものか、それを試行したときにSyntaxErrorを発生させるもののいずれかである必要があります(通常<…>
によって生成スタイルobject.__repr__
)。それは年々徐々に落ち着いてきました、そして2.7と3.xでそれはちょうど「多くのタイプに対して」真実であり、そしてstdlibでさえ例外があります(例えば、namedtuple
ローカルとして作成されたタイプはrepr
あなたにあなたに与えることができます ' t eval
)、しかしそれは元のアイデアでした。
あなたが言う時
foo = 'bar'
baz(foo)
関数に渡っfoo
ていませんbaz
。 foo
は値を表すために使用される単なる名前です(この場合'bar'
は)baz
。その値は関数に渡されます。