9

__repr__関数が返すことができる さまざまな方法があるようです。

多くのものを格納するクラス InfoObj がありますが、そのうちのいくつかは、クラスのユーザーが自分で設定することを特に望んでいません。私はPythonで何も保護されていないことを認識しており、とにかく飛び込んで設定することができますが、それを定義すると、__init__誰かがそれを見て、それを渡しても問題ないと思い込む可能性が高くなります.

(例: オブジェクトが完全に取り込まれたと判断されたときに検証関数によって設定されるブール値と、そうするのに十分な情報が保存されているときに他の値から計算される値... たとえば、A = B + C のように 1 回A と B が設定され、次に C が計算され、オブジェクトが Valid=True とマークされます。)

以上のことから、__ repr__ の出力を設計する最良の方法はどれでしょうか?

    bob = InfoObj(Name="Bob")
    # Populate bob.

    # Output type A:
    bob.__repr__()
'<InfoObj object at 0x1b91ca42>'

    # Output type B:
    bob.__repr__()
'InfoObj(Name="Bob",Pants=True,A=7,B=5,C=2,Valid=True)'

    # Output type C:
    bob.__repr__()
'InfoObj.NewInfoObj(Name="Bob",Pants=True,A=7,B=5,C=2,Valid=True)'

...タイプCのポイントは、C++で「プライベート」に設定したすべてのものをコンストラクターへの引数として喜んで取り、クラスを使用するチームメイトにインターフェース関数を使用してそれをセットアップさせることです。彼らのために。その場合、次の目的のために、特定のものを取り込まないコンストラクターと、少し気づきにくい別の関数を定義します。__repr__

違いがある場合は、少なくともより良い方法を考え出さない限り、これらの python オブジェクトを出力を使用してデータベースに保存し、を使用して__repr__取得することを計画しています。eval()チームメイトが適切なインターフェイス機能を使用せずに完全なオブジェクトを手動で作成した結果、誰かが何をしたかを理解するまで、1 つのタイプの情報取得が不安定になる可能性があります。

4

1 に答える 1

13

この__repr__方法は、エンドユーザーではなく、開発者にとって最も有用な出力を生成するように設計されているため、この質問に実際に答えることができるのはあなただけです。ただし、通常はオプション B を使用します。オプション A はあまり役に立ちません。オプション C は不必要に冗長です。とにかく、モジュールがどのようにインポートされるかわかりません。他の人はオプション C を好むかもしれません。

ただし、Python オブジェクトをデータベースに格納する場合は、pickle.

import pickle
bob = InfoObj(Name="Bob")

> pickle.dumps(bob)
b'...some bytestring representation of Bob...'

> pickle.loads(pickle.dumps(bob))
Bob(...)

cPickle古い Python (3.x より前) を使用している場合は、こちらの方が高速ですが、pickle拡張性が高いことに注意してください。一部のクラスでは Pickle を構成しなくても動作しますが、より複雑なオブジェクトの場合は、カスタムの pickler を作成することをお勧めします。

于 2011-06-15T02:52:36.450 に答える