web-dev-qa-db-ja.com

!rはstr()とrepr()で何をしますか?

Python 2.7.12ドキュメント によると:

_!s_(apply str())および_!r_(apply repr())を使用して、値をフォーマットする前に変換できます。

_>>> import math
>>> print 'The value of PI is approximately {}.'.format(math.pi)
The value of PI is approximately 3.14159265359.
>>> print 'The value of PI is approximately {!r}.'.format(math.pi)
The value of PI is approximately 3.141592653589793.
_

興味深いことに、変換された値はrepr()ではなくstr()の出力です。

_>>> str(math.pi)
'3.14159265359'
>>> repr(math.pi)
'3.141592653589793'
_

ここで「値を変換する」とはどういう意味ですか?人間が判読しにくくしますか?

18
nalzok

文字列の形式にするには、まずその文字列表現を作成する必要があります。 「値を変換する」とは、基本的には文字列表現がどのように構築されるかについて話します。 Pythonでは、何かの文字列表現を取得するかなり自然な選択肢が2つあります... strreprstrは一般に少し人にやさしい、reprは一般的に正確です。おそらく 公式ドキュメント が違いを探すのに最適な場所です。

object.__repr__(self)

  • repr()組み込み関数によって呼び出され、オブジェクトの「公式の」文字列表現を計算します。可能であれば、これは有効なPython式を使用して、同じ値でオブジェクトを再作成するために使用できます(適切な環境が与えられた場合)。これが不可能な場合は、 _<...some useful description...>_の形式を返す必要があります。戻り値は文字列オブジェクトである必要があります。クラスが__repr__()を定義し、__str__()を定義しない場合、__repr__()はまた、そのクラスのインスタンスの「非公式な」文字列表現が必要な場合にも使用されます。

  • これは通常、デバッグに使用されるため、表現が情報豊富で明確であることは重要です。

object.__str__(self)

  • Str(object)と組み込み関数format()およびprint()によって呼び出され、オブジェクトの「非公式」または適切に印刷可能な文字列表現を計算します。戻り値は文字列オブジェクトでなければなりません。

  • このメソッドはobject.__repr__()とは異なり、__str__()が有効なPython式を返すという期待はありません。より便利で簡潔な表現を使用できます。

  • 組み込み型オブジェクトによって定義されたデフォルトの実装はobject.__repr__()を呼び出します。

_str.format_では、_!s_はstrを使用してオブジェクトをフォーマットすることを選択し、_!r_はreprを使用して値をフォーマットします。

違いは文字列で簡単に確認できます(文字列のreprには外側の引用符が含まれるため)。

_>>> 'foo {}'.format('bar')
'foo bar'
>>> 'foo {!r}'.format('bar')
"foo 'bar'"
_

これら2つの方法の違いは、実際にフォーマットされるオブジェクトに大きく依存します。多くのオブジェクト(たとえば、___str___メソッドをオーバーライドしないオブジェクト)では、フォーマットされた出力に違いはありません。

26
mgilson