2
#Combine %r with double-quote and single-quote escapes and print them out. 
#Compare %r with %s. Notice how %r prints it the way you'd write it in your file, 
#but %s  prints it the way you'd like to see it?

これは私が演習のために書いたものです:

1) mybugs1 = "Guido said: %r and moved on." %'I \'love\' \"my\" bugs'

2) mybugs2 = "Stallman said: %s and moved on." % 'I \'love\' \"my\" bugs'

3) print mybugs1

4) print mybugs2 

出力

Guido said: 'I \'love\' "my" bugs' and moved on.

Stallman said: I 'love' "my" bugs and moved on.

質問

%r は、.py ファイルに記述した方法ですべてを出力するわけではありません (たとえば、1 行目の \"my\" ではなく "my" を出力します)。なんで?

4

2 に答える 2

3

一重引用符または二重引用符、単一行または複数行、生または通常を使用して、Python で文字列リテラルを記述する方法はいくつかあります。ただし、文字列自体にはそのどれも保持されません。パーサーがそれを解析すると、それがソースでどのように提示されたかについての情報は残りません。ソースにある必要さえありません。たとえば、ファイルから読み取るか、ユーザーに尋ねるか、数値を文字列に変換することにより、文字列を動的に生成できます。

そのため、文字列の場合repr()、python はそれをリテラルのようにフォーマットする方法を推測します。使用するルールは単純です。文字列に単一引用符が含まれ、二重引用符が含まれていない場合、単一行、二重引用符、非生のリテラルが使用されます。それ以外の場合はすべて、一行一重引用符で囲まれた未加工のリテラルを使用します。別の言い方をすれば、Python は一重引用符を好みますが、一重引用符を含み、二重引用符を含まない文字列をフォーマットする場合、二重引用符でrepr()囲まれた文字列を使用してバックスラッシュで引用符をエスケープせずにその文字列を作成できます。

覚えておいてrepr()ください、それはあなたが入力したものを知らないので、あなたが入力したものを返しません。すべてを入力したことはないかもしれません。解析して同じ値に戻すことができるものを返します。ID *は次のとおりです。

x == eval(repr(x))

いいえ

x == repr(eval(x))

*repr()これについても魔法ではありません。すべてのオブジェクト__repr__がこの制約を保持する方法で実装されているわけではありません。repr は主に、Python コードを生成するためではなく、有用なデバッグ情報を提供するために使用されます

于 2011-10-17T10:05:37.097 に答える
2

単一引用符内の二重引用符はエスケープする必要はありません。

パーサーはバックスラッシュを削除します。

>>> s = 'I \'love\' \"my\" bugs'
>>> s
'I \'love\' "my" bugs'
>>> 
于 2011-10-17T08:49:59.267 に答える