Frage

In Python 2.6 (und früher) die hex() und oct() integrierte Funktionen kann durch die Definition __hex__ in einer Klasse überlastet werden und __oct__ Sonderfunktionen. Allerdings gibt es kein __bin__ spezielle Funktion das Verhalten der integrierten Python 2.6 die neue bin() Funktion für Überlastung.

Ich möchte wissen, ob es eine Möglichkeit, flexibel Überlastung bin() ist, und wenn nicht ich habe mich gefragt, warum die uneinheitliche Schnittstelle?

Ich weiß, dass die __index__ spezielle Funktion verwendet werden kann, aber das ist nicht flexibel, da es nur eine ganze Zahl zurückgeben kann. Mein besonderer Anwendungsfall ist von der bitstring Modul, wo führenden Null-Bits betrachtet werden signifikant:

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

Ich vermute, dass es keine Möglichkeit, dies zu erreichen, aber ich dachte, es würde nicht zu fragen, verletzt!

War es hilfreich?

Lösung 2

Ich denke, die kurze Antwort lautet: ‚Nein, bin() nicht überlastet wie oct() und hex() werden kann.‘

Wie, warum, die Antwort mit Python 3.0 liegen muss, die __index__ verwendet hex(), oct() und bin() zu überlasten, und hat die __oct__ entfernt und __hex__ Sonderfunktionen zusammen.

So ist die Python 2.6 bin() sehr viel sieht aus wie es ist wirklich eine Python 3.0-Funktion, die ohne viel Rücksicht zurückportiert wurde, dass es Dinge die neue Python 3-Wege, anstatt die alte Python 2-Wege tun. Ich würde auch vermuten, dass es unwahrscheinlich ist, festgelegt werden, auch wenn es in Betracht gezogen wird, um ein Problem zu sein.

Andere Tipps

Wie Sie vielleicht schon entdeckt haben, können Sie nicht bin() außer Kraft setzen, aber es klingt nicht wie Sie das tun müssen. Sie wollen einfach nur eine 0-gepolsterte Binärwert. Leider gibt es in Python 2.5 und vorherigen, können Sie nicht „% b“ verwenden binär, um anzuzeigen, so dass Sie nicht den „%“ string Formatierung Operator das gewünschte Ergebnis zu erzielen, verwenden können.

Zum Glück Python 2.6 nicht bieten, was Sie wollen, in Form der neuen str .format () Methode. Ich glaube, dass dieses besondere Stück Line-Lärm ist das, was Sie suchen:

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

Die Syntax für diese Mini-Sprache ist unter „ Formatspezifikation Mini-Sprache “in der Dokumentation. Sie einige Zeit zu sparen, werde ich die Zeichenfolge erklären, die ich verwende:

  1. Parameter Null (d.h. 19) formatiert werden soll, mit
  2. a magic "0", um anzuzeigen, dass ich will 0-gepolstert, rechtsbündig Zahl mit
  3. 10 Ziffern der Präzision, in
  4. Binärformat.

Sie können diese Syntax verwenden, um eine Vielzahl von kreativen Versionen der Ausrichtung und Polsterung zu erreichen.

Die Bin-Funktion empfängt es Wert aus dem __index__ Funktion des Objekts. Also für ein Objekt, können Sie den Wert binär umgewandelt definieren, aber Sie können das Format der Zeichenfolge nicht definieren.

Sie können das gleiche Verhalten wie für hex erreichen und Oktober durch zwingende / die eingebaute ist () Funktion mit Ihrer eigenen Implementierung ersetzen, die versucht zu nennen ist auf dem Objekt übergeben wird und fielen zurück auf die Standardfach () Funktion, wenn das Objekt hat keine ist . Doch auf der Grundlage, dass explizite ist besser als implizites, Ihre Anwendung Codierung auf einer benutzerdefinierte Version von sind abzuhängen () ist wahrscheinlich keine gute Idee, so vielleicht auch nur der Funktion eines anderen Namen geben z.

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

Als Grund für die Inkonsistenz in der Schnittstelle, ich bin nicht sicher. Vielleicht liegt es daran ist () wurde in jüngster Zeit hinzugefügt, so dass es eine leichte Kontrolle ist?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top