Pode bin () ser sobrecarregado como outubro () e Hex () em Python 2.6?
-
05-07-2019 - |
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!
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:
- parâmetro zero (ou seja
19
) deve ser formatado, usando - a mágica "
0
" para indicar que eu quero 0 acolchoado número, alinhado à direita, com - 10 dígitos de precisão, em
- 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?