2009-06-16 2 views
12

Python 2.6(およびそれ以前)のhex()oct()組み込み関数は、__hex____oct__特殊関数を定義することで、クラス内でオーバーロードすることができます。しかし、Python 2.6の新しいbin()組み込み関数の動作を過負荷にする特別な関数は__bin__ではありません。Python 2.6ではbin()をoct()やhex()のようにオーバーロードできますか?

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

短い答えは「いいえ、bin()oct()hex()のようにオーバーロードできません。理由として

、答えはhex()oct()bin()をオーバーロードする__index__を使用し、完全に__oct____hex__特別な機能を削除しているのPython 3.0、で存在しなければなりません。

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

1

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

0

ビンをオブジェクトに渡そうとした独自の実装でビルトインされたbin()関数をオーバーライド/置き換えることで、同じ動作を実現できます。 )関数は、オブジェクトがbinを提供しなかった場合に機能します。しかし、暗黙的よりも明示的に優れていることに基づいて、bin()のカスタムバージョンに依存するようにアプリケーションをコーディングするのは良い考えではないでしょう。

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

なぜインタフェースの不一致がわかりましたか、わかりません。おそらくbin()が最近追加されたので、わずかな見落としですか?

11

既に発見したように、bin()を上書きすることはできませんが、そうする必要はありません。あなたは0パディングバイナリ値がほしいだけです。残念ながら、Python 2.5以前ではバイナリを示す "%b"を使うことができなかったので、 "%"文字列フォーマット演算子を使用して結果を得ることはできません。

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

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

このミニ言語の構文は、ドキュメントの「format specification mini-language」の下にあります。あなたにいくつかの時間を節約するために、私は私が使用している文字列を説明します:

  1. パラメータがゼロ(すなわち19は)私は0-をしたいことを示すために
  2. 0を」魔法を使用して、書式設定する必要があります数字の右側には、
  3. 10桁の精度があり、
  4. バイナリ形式です。

この構文を使用して、さまざまなアライメントとパディングのクリエイティブなバージョンを作成できます。

+0

ありがとう、それは知っていると便利です。私はすでに私が望んだ形で出力を得ることができたが、私はbin関数を返すことができなかった。あなたのstr.formatメソッドは、私が使ったメソッドよりもかなり簡潔です! –

+0

も参照してくださいhttp://stackoverflow.com/questions/3258330/converting-from-hex-to-binary-without-losing-leading-0s-python – endolith

関連する問題