Pergunta

Em Python 2.6 (e anteriores) o hex() e oct() built-in funções pode ser sobrecarregado em uma classe, definindo funções __hex__ e especiais __oct__. No entanto, não é uma função __bin__ especial para sobrecarregar o comportamento do Python 2.6 do novo bin() built-in função.

Eu quero saber se há alguma maneira de forma flexível sobrecarga bin(), e se não eu estava perguntando por que a interface inconsistente?

Eu sei que a função __index__ especial pode ser usado, mas isso não é flexível, uma vez que só pode retornar um inteiro. Meu caso de uso particular é do bitstring módulo, onde zero bits são considerados significativos:

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

Eu suspeito que não há nenhuma maneira de conseguir isso, mas eu pensei que não iria prejudicar a perguntar!

Foi útil?

Solução 2

Eu acho que a resposta é 'Não, bin() não pode ser sobrecarregado como oct() e hex().'

por que motivo, a resposta deve estar com Python 3.0, que utiliza __index__ para hex() sobrecarga, oct() e bin(), e removeu as funções especiais e __oct__ __hex__ completamente.

Assim, os Python 2.6 bin() se parece muito com ele é realmente uma característica Python 3.0 que foi back-portados sem muita consideração que ele está fazendo coisas a maneira nova Python 3, em vez do velho Python 2 vias. Eu também acho que é improvável para ficar fixo, mesmo que seja considerado um bug.

Outras dicas

Como você já descobriu, você não pode substituir bin(), mas não parece que você precisa fazer isso. Você só quer um valor binário 0 acolchoado. Infelizmente, em python 2.5 e anterior, você não pode usar "% b" para indicar binário, então você não pode usar a string "%" formatação operador para alcançar o resultado desejado.

Felizmente python 2.6 não oferecem o que você quer, na forma do novo str .format () método . Eu acredito que esse trecho da linha-ruído é o que você está procurando:

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

A sintaxe para este mini-linguagem é em " especificação do formato mini-linguagem " nos docs. Para poupar algum tempo, eu vou explicar a seqüência que eu estou usando:

  1. parâmetro zero (ou seja 19) deve ser formatado, usando
  2. a mágica "0" para indicar que eu quero 0 acolchoado número, alinhado à direita, com
  3. 10 dígitos de precisão, em
  4. formato binário.

Você pode usar esta sintaxe para alcançar uma variedade de versões criativas de alinhamento e preenchimento.

A função bin recebe do valor da função __index__ do objeto. Assim, para um objeto, você pode definir o valor convertido para binário, mas você não pode definir o formato do texto.

Você poderia conseguir o mesmo comportamento para hex e outubro, substituindo / substituir a função interna no bin () com sua própria implementação que tentaram chamada bin no objeto que está sendo passado e caiu de volta para a função bandeja padrão () se o objeto não forneceu bin . No entanto, na base de que explícita é melhor do que implícito, codificação do seu aplicativo que depender de uma versão personalizada do bin () provavelmente não é uma boa idéia, então talvez apenas dar a função de um nome diferente por exemplo.

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

Quanto à razão da inconsistência na interface, não tenho certeza. Talvez seja porque bin () foi adicionado mais recentemente, por isso é uma ligeira supervisão?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top