10

私の現在のプロジェクトでは、ビット フィールドを広範囲に使用する必要があります。ちょっとしたフィールド クラスのシンプルで機能的なレシピを見つけましたが、必要な機能がいくつか欠けていたため、それを拡張することにしました。私は実装する必要があり、慣習に従っていることを確認したいと思います__str____repr__

__str__非形式的で簡潔なはずなので、ビット フィールドの 10 進数値を返すようにしました (つまりstr(bit field 11)"3".

__repr__はオブジェクトの正式な表現であるはずなので、実際のビット文字列を返すようにしました (つまりrepr(bit field 11)、 になります"11")。

strあなたの意見では、この実装はとの規則を満たしていreprますか?

さらに、bin()関数を使用して、クラスに格納されている値のビット文字列を取得しました。これは Python < 2.6 と互換性がありません。別の方法はありますか?

乾杯、

ピート

4

3 に答える 3

12

__repr__、オブジェクトを再作成するために使用できる文字列であることが望ましいです。たとえば、オブジェクトで使用する場合は、こちらevalのドキュメントを参照してください。これは正確な科学ではありません。たとえば、モジュールのユーザーがモジュールをインポートした方法に依存する可能性があるためです。

__str__バイナリ文字列を返し__repr__たりClassname(binary_string)、オブジェクトを再作成するために使用できるものを返したりします。

ビット文字列モジュール(私が維持している)では、__str__ビット文字列が4ビットの倍数である場合は16進数であり、それ以外の場合は2進数または2つの組み合わせです。また、ビット文字列が非常に長い場合は切り捨てられます(インタラクティブセッションで100 MBのビット文字列を印刷しようとしないでください!)

bin()もし私があなたなら、この関数を使うのは絶対に避けたいと思います。その理由は、ビット文字列がゼロビットで始まる場合は使用できないためです(ここでの私の質問を参照してください)。bin代わりに、メソッドまたはプロパティのいずれかを使用することをお勧めします。

于 2010-05-11T17:19:40.997 に答える
1

__str__代わりに16進数表現を返すことを検討します。このようにして、実際のビット値が何であるかを目で確認しやすくなり、より便利になります。それでも非常に簡潔です (実際、10 進数表現よりも少ない文字数です)。

于 2010-05-11T17:10:48.553 に答える
0

__repr__コンストラクターに渡された場合、元のオブジェクトと同一のコピーである新しいオブジェクトを作成する何かを返す必要があります。

あなたのものは「11」を返しますが、「11」をコンストラクターに渡すと、結果として同じビットフィールドが得られません。したがって、これ__repr__は問題ありません。

于 2010-05-11T17:25:32.877 に答える