bin()は、Python 2.6のoct()およびhex()のようにオーバーロードできますか?
-
05-07-2019 - |
質問
Python 2.6(およびそれ以前)では、 __ hex __ を定義することにより、
hex()
および oct()
組み込み関数をクラスでオーバーロードできます。 code>および __ oct __
特殊関数。ただし、Python 2.6の新しい 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'
これを達成する方法はないのではないかと疑っていますが、質問しても問題ないと思います!
解決 2
短い答えは「いいえ、 oct()
や hex()
のように bin()
をオーバーロードすることはできないと思います。 '
理由については、 __ index __
を使用して hex()
、 oct()
および< code> bin()、および __ oct __
および __ hex __
特殊関数をすべて削除しました。
したがって、Python 2.6 bin()
は、古いPythonではなく、新しいPython 3の方法で動作することをあまり考慮せずにバックポートされた実際のPython 3.0機能に非常によく似ています2ウェイ。また、バグと見なされても、修正される可能性は低いと思います。
他のヒント
すでに発見したように、 bin()
をオーバーライドすることはできませんが、それを行う必要があるとは思えません。 0が埋め込まれたバイナリ値が必要です。残念ながら、Python 2.5以前では、&quot;%b&quot;を使用できませんでした。バイナリを示すため、&quot;%&quot;は使用できません。必要な結果を得るための文字列フォーマット演算子。
幸運なPython 2.6は、新しい strの形式で、あなたが望むものを提供します.format()メソッド。このラインノイズの特定のビットがあなたが探しているものだと信じています:
>>> '{0:010b}'.format(19)
'0000010011'
このミニ言語の構文は&quot; formatの下にあります仕様ミニ言語&quot;ドキュメント内。時間を節約するために、使用している文字列について説明します。
- パラメータゼロ(つまり、
19
)は、次を使用してフォーマットする必要があります - 魔法の&quot;
0
&quot; 0で埋められた、右揃えの数値が必要であることを示すために、 - 10桁の精度、
- バイナリ形式。
この構文を使用して、位置合わせとパディングのさまざまなクリエイティブバージョンを実現できます。
bin関数は、オブジェクトの __ index __
関数から値を受け取ります。したがって、オブジェクトの場合、バイナリに変換された値を定義できますが、文字列の形式は定義できません。
渡されるオブジェクトで bin を呼び出してフォールバックする独自の実装で組み込みbin()関数をオーバーライド/置換することにより、hexおよびoctと同じ動作を実現できます。オブジェクトが bin を提供しなかった場合、標準のbin()関数。ただし、明示的は暗黙的よりも優れていることに基づいて、bin()のカスタムバージョンに依存するようにアプリケーションをコーディングすることはおそらく良い考えではないので、関数に別の名前を付けるだけです(例:
)def mybin(n):
try:
return n.__bin__()
except AttributeError:
return bin(n)
インターフェースの不一致の理由については、わかりません。たぶん、bin()が最近追加されたので、ちょっと見落としているのでしょうか?