Domanda

In Python 2.6 (e precedenti) le funzioni integrate hex () e oct () possono essere sovraccaricate in una classe definendo __hex __ e __oct__ funzioni speciali. Tuttavia non esiste una funzione speciale __bin__ per sovraccaricare il comportamento del nuovo bin () di Python 2.6.

Voglio sapere se esiste un modo per sovraccaricare in modo flessibile bin () , e se no mi chiedevo perché l'interfaccia incoerente?

So che è possibile utilizzare la funzione speciale __index__ , ma questa non è flessibile in quanto può restituire solo un numero intero. Il mio caso d'uso particolare viene dal bitstring , in cui i bit zero iniziali sono considerati significativi:

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

Sospetto che non ci sia modo di raggiungerlo, ma ho pensato che non sarebbe male chiedere!

È stato utile?

Soluzione 2

Penso che la risposta breve sia 'No, bin () non può essere sovraccaricato come oct () e hex () . '

Perché, la risposta deve trovarsi con Python 3.0, che usa __index__ per sovraccaricare hex () , oct () e < code> bin () e ha rimosso del tutto le funzioni speciali __oct__ e __hex__ .

Quindi il bin () di Python 2.6 sembra molto simile a una vera funzionalità di Python 3.0 che è stata trasferita indietro senza troppe considerazioni sul fatto che sta facendo cose nel nuovo modo di Python 3 piuttosto che nel vecchio Python 2 vie. Immagino anche che è improbabile che venga corretto, anche se è considerato un bug.

Altri suggerimenti

Come hai già scoperto, non puoi ignorare bin () , ma non sembra che tu debba farlo. Volete solo un valore binario con 0 caratteri. Sfortunatamente in Python 2.5 e precedenti, non puoi utilizzare "% b " per indicare binario, quindi non puoi utilizzare il "% " operatore di formattazione delle stringhe per ottenere il risultato desiderato.

Fortunatamente python 2.6 offre ciò che desideri, sotto forma del nuovo str Metodo .format () . Credo che questo particolare rumore di linea sia ciò che stai cercando:

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

La sintassi per questo mini-linguaggio è nel formato " specifica mini-lingua " nei documenti. Per farti risparmiare un po 'di tempo, ti spiego la stringa che sto usando:

  1. il parametro zero (cioè 19 ) deve essere formattato, usando
  2. una magia " 0 " per indicare che desidero un numero con 0, allineato a destra, con
  3. 10 cifre di precisione, in
  4. formato binario.

Puoi utilizzare questa sintassi per ottenere una varietà di versioni creative di allineamento e riempimento.

La funzione bin riceve il suo valore dalla funzione __index__ dell'oggetto. Quindi, per un oggetto, puoi definire il valore convertito in binario, ma non puoi definire il formato della stringa.

È possibile ottenere lo stesso comportamento di hex e oct sovrascrivendo / sostituendo la funzione bin () incorporata con la propria implementazione che ha tentato di chiamare bin sull'oggetto che è stato passato e ricaduto su la funzione bin () standard se l'oggetto non ha fornito bin . Tuttavia, sulla base del fatto che esplicito sia meglio di implicito, codificare l'applicazione in modo che dipenda da una versione personalizzata di bin () non è probabilmente una buona idea, quindi forse dare alla funzione un nome diverso, ad esempio

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

Per quanto riguarda il motivo per cui l'incoerenza nell'interfaccia, non sono sicuro. Forse è perché bin () è stato aggiunto più di recente, quindi è una leggera svista?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top