16

Python 2.6 (およびそれ以前) では、組み込み関数hex()および組み込み関数は、および特別な関数oct()を定義することによって、クラスでオーバーロードできます。ただし、Python 2.6 の新しい組み込み関数の動作をオーバーロードするための特別な関数はありません。__hex____oct____bin__bin()

を柔軟にオーバーロードする方法があるかどうかを知りたいのですがbin()、そうでない場合は、なぜ一貫性のないインターフェースなのか疑問に思っていましたか?

特殊関数を使用できることは知ってい__index__ますが、整数しか返せないため、これは柔軟ではありません。私の特定の使用例は、先行ゼロビットが重要と見なされるbitstringモジュールからのものです。

>>> a = BitString(length=12)       # Twelve zero bits
>>> hex(a)
'0x000'
>>> oct(a)
'0o0000'
>>> bin(a)
'0b0' <------ I want it to output '0b000000000000'

これを達成する方法はないと思いますが、質問しても問題ないと思いました。

4

4 に答える 4

12

すでに発見しているように、オーバーライドすることはできませんがbin()、それを行う必要があるようには思えません。0が埋め込まれたバイナリ値が必要です。残念ながら、Python 2.5以前では、「%b」を使用してバイナリを示すことができなかったため、「%」文字列書式演算子を使用して目的の結果を得ることができませんでした。

幸いなことに、Python 2.6は、新しいstr.format()メソッドの形式で必要なものを提供します。この特定のラインノイズがあなたが探しているものだと私は信じています:

>>> '{0:010b}'.format(19)
'0000010011'

このミニ言語の構文は、ドキュメントの「フォーマット仕様ミニ言語」の下にあります。時間を節約するために、私が使用している文字列について説明します。

  1. パラメータゼロ(つまり19)は、を使用してフォーマットする必要があります
  2. 魔法の" 0"は、0が埋め込まれ、右揃えの数字が必要であることを示します。
  3. 10桁の精度、
  4. バイナリ形式。

この構文を使用して、さまざまなクリエイティブバージョンの配置とパディングを実現できます。

于 2009-06-18T10:04:34.817 に答える
7

簡単な答えは、「いいえ、andのbin()ようにオーバーロードすることはできません」だと思います。oct()hex()

理由については、答えは Python 3.0 にあるに違いありません。Python 3.0 では、、およびが__index__オーバーロードされ、および特殊関数が完全に削除されています。hex()oct()bin()__oct____hex__

したがって、Python 2.6bin()は、古い Python 2 の方法ではなく、新しい Python 3 の方法で物事を行っていることをあまり考慮せずにバックポートされた、実際には Python 3.0 の機能のように見えます。また、バグと見なされたとしても、修正される可能性は低いと思います。

于 2009-07-06T16:01:13.373 に答える
1

bin関数は、オブジェクトの__index__関数からその値を受け取ります。したがって、オブジェクトの場合、バイナリに変換された値を定義することはできますが、文字列の形式を定義することはできません。

于 2009-06-16T15:23:38.127 に答える
0

組み込みの bin() 関数を、渡されるオブジェクトでbinを呼び出そうとした独自の実装でオーバーライド/置換することで、hex および oct と同じ動作を実現でき、オブジェクトが呼び出されなかった場合は標準の bin() 関数にフォールバックします。binを提供しないでください。ただし、明示的は暗黙的よりも優れていることに基づいて、カスタムバージョンの bin() に依存するようにアプリケーションをコーディングすることはおそらく良い考えではないため、関数に別の名前を付けてください。

def mybin(n):
    try:
        return n.__bin__()
    except AttributeError:
        return bin(n)

インターフェイスの不一致の理由については、よくわかりません。bin() が最近追加されたので、少し見落としているのでしょうか?

于 2009-06-16T16:49:54.647 に答える