Question

Dans Python 2.6 (et versions antérieures), les fonctions intégrées hex () et oct () peuvent être surchargées dans une classe en définissant __ hex __ et __ oct __ . Cependant, il n'existe pas de fonction spéciale __ bin __ pour surcharger le comportement de la nouvelle fonction intégrée bin () de Python 2.6.

Je veux savoir s’il est possible de surcharger de manière flexible bin () , et si ce n’était pas le cas, je me demandais pourquoi l’interface incohérente?

Je sais que la fonction spéciale __ index __ peut être utilisée, mais elle n’est pas flexible car elle ne peut renvoyer qu’un entier. Mon cas d'utilisation particulier provient du module bitstring , où les bits zéro en tête sont considérés comme importants:

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

Je soupçonne qu'il n'y a aucun moyen d'y parvenir, mais je pensais que ça ne ferait pas de mal de demander!

Était-ce utile?

La solution 2

Je pense que la réponse courte est "Non, bin () ne peut pas être surchargé comme oct () et hex () . '

Pour ce qui est de savoir pourquoi, la réponse doit appartenir à Python 3.0, qui utilise __ index __ pour surcharger hex () , oct () et < code> bin () et a supprimé les fonctions spéciales __ oct __ et __ hex __ .

Le bin () de Python 2.6 ressemble donc beaucoup à une fonctionnalité de Python 3.0 qui a été rétroportée sans trop se soucier du fait qu’elle fonctionne de la même manière que Python 3. 2 voies. J'imagine aussi qu'il est peu probable qu'il soit corrigé, même s'il s'agit d'un bogue.

Autres conseils

Comme vous l'avez déjà découvert, vous ne pouvez pas remplacer bin () , mais il ne semble pas que vous ayez à le faire. Vous voulez juste une valeur binaire 0-complétée. Malheureusement, dans Python 2.5 et les versions antérieures, vous ne pouviez pas utiliser "% b " pour indiquer binaire, vous ne pouvez donc pas utiliser le "% " formatage de chaîne pour obtenir le résultat souhaité.

Heureusement, python 2.6 offre ce que vous voulez, sous la forme du nouveau str Méthode .format () . Je pense que vous recherchez ce bruit de ligne particulier:

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

La syntaxe de cette mini-langue est sous & format spécification mini-langage " dans les docs. Pour vous faire gagner du temps, je vais expliquer la chaîne que j'utilise:

  1. le paramètre zéro ( 19 ) doit être formaté à l'aide de
  2. une magie " 0 " pour indiquer que je veux un nombre 0-complété, aligné à droite, avec
  3. 10 chiffres de précision, en
  4. format binaire.

Vous pouvez utiliser cette syntaxe pour créer diverses versions créatives d'alignement et de remplissage.

La fonction bin reçoit sa valeur de la fonction __ index __ de l'objet. Donc, pour un objet, vous pouvez définir la valeur convertie en binaire, mais vous ne pouvez pas définir le format de la chaîne.

Vous pouvez obtenir le même comportement que pour hex et oct en en remplaçant / remplaçant la fonction bin () intégrée par votre propre implémentation ayant tenté d'appeler bin sur l'objet en cours de transmission et en revenant à la fonction bin () standard si l'objet n'a pas fourni bin . Cependant, étant donné que explicite vaut mieux qu'implicite, coder votre application pour qu'elle repose sur une version personnalisée de bin () n'est probablement pas une bonne idée. Vous pouvez donc simplement donner à la fonction un nom différent, par exemple.

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

Quant à la raison de l'incohérence de l'interface, je ne suis pas sûr. C'est peut-être parce que bin () a été ajouté plus récemment, donc c'est un léger oubli?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top