状態に関する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'>"
だけではありません。