Python >> Tutoriel Python >  >> Python

Non, Python __hex__() n'existe pas. Faites ceci à la place !

Le problème

TypeError: '...' object cannot be interpreted as an integer

Si vous lisez cet article, il y a de fortes chances que vous ayez pensé à quelque chose dans ce sens :

  • Étant donné une classe personnalisée My_Class . Vous souhaitez remplacer le comportement du hex(x) intégré fonction en Python lors de son appel sur un My_Class objet x .
  • Vous connaissez la fonctionnalité des méthodes Dunder pour écraser le comportement personnalisé des fonctions intégrées.
  • Vous concluez que la méthode dunder pour hex() est __hex__() parce que, après tout, c'est comme ça que ça doit marcher, n'est-ce pas ?
  • Mauvais ! Si vous essayez de le faire, vous obtenez l'erreur suivante.

Le mauvais exemple :non !

class My_Class:
    def __hex__(self): # WRONG!
        return 42


x = My_Class()
print(hex(x))

La sortie indique que quelque chose s'est mal passé :

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\code.py", line 7, in <module>
    print(hex(x))
TypeError: 'My_Class' object cannot be interpreted as an integer

Que faire ?

Comment pouvez-vous résoudre le TypeError: 'My_Class' object cannot be interpreted as an integer ?

Pour résoudre le TypeError lorsque vous essayez de remplacer le comportement du hex() fonction utilisant le __hex__() méthode est d'oublier le __hex__() méthode et utilisez le __index__() méthode à la place.

Le __index__() renvoie une valeur entière associée à un objet donné. L'entier est alors automatiquement converti en un nombre hexadécimal.

Le bon exemple – Faites !

Voici comment cela fonctionne dans un exemple simple :

class My_Class:
    def __index__(self): # Correct!
        return 42


x = My_Class()
print(hex(x))
# 0x2a

Au cas où vous vous poseriez des questions sur la sortie 0x2a au lieu de ce que vous avez défini, c'est-à-dire 42 , l'entier 42 est converti en nombre hexadécimal 0x2a . Voir ici :

>>> hex(42)
'0x2a'

Hex de fond() - Pas un tour de magie

hex(integer) intégré de Python la fonction prend un argument entier et renvoie une chaîne hexadécimale avec le préfixe "0x" .