状態に関するPython 2のドキュメント__repr__として:
可能な限り、これ (つまり) は、同じ値を持つオブジェクトを再作成するために使用できる
__repr__有効な Python 式のように見える必要があります(適切な環境が与えられた場合)。
では、クラスのビルトイン__repr__がそのガイドラインに従って動作しないのはなぜでしょうか?
例
>>> class A(object):
... pass
>>> repr(A)
"<class 'A'>"
ガイドラインを満たすために、デフォルトは、つまり一般的に__repr__を返す必要があります。なぜそれは異なった働きをするのですか?実装は非常に簡単だと思います。"A"A.__name__
編集:「複製」の範囲
議論の中で何が返されるべきかが明確ではないことが回答でわかりreprます。私の見方では、repr関数はオブジェクトを再現できる文字列を返す必要があります。
- 任意のコンテキストで
- 自動的に(つまり、手動ではありません)。
Ad.1。組み込みクラスのケースを見てください (この SO questionから取得):
>>> from datetime import date
>>>
>>> repr(date.today()) # calls date.today().__repr__()
'datetime.date(2009, 1, 16)'
どうやら、仮定されたコンテキストは、あたかもインポートの基本的な形式、つまり を使用したかのimport datetimeようです。つまり、オブジェクトをゼロから表現する必要はないということです。コミュニティが同意したコンテキストで明確であれば、それで十分です。たとえば、直接モジュールの型と関数を使用します。合理的に聞こえますよね?eval(repr(date.today()))datetime__repr__
Ad.2。オブジェクトがどのように再構築されたかという印象を与えるだけでは不十分だreprと思います。デバッグの有用性が の目的ですstr。
結論
したがって、私が期待してreprいるのは、結果に基づいて実行できるようevalにすることです。クラスの場合、クラスをゼロから再構築するコード全体を取得したくありません。代わりに、スコープ内で見えるクラスへの明確な参照が必要です。で"Module.Class"十分でしょう。Python さん、悪気はありませんが、それ"<class 'Module.Class'>"だけではありません。