Python >> Tutoriel Python >  >> Python

Méthode magique Python __float__()

Syntaxe

object.__float__(x)

Le Python __float__() la méthode implémente le float() intégré fonction. Ainsi, lorsque vous appelez le float(x) , Python tente d'appeler x.__float__() . Si la valeur de retour n'est pas un flottant, Python lèvera un TypeError . Si x.__float__() n'est pas implémenté, Python tente d'appeler x.__index__() d'abord et seulement si cela n'est pas implémenté non plus, cela lève un TypeError .

Nous appelons cela une "méthode Dunder" pour "D ouble Sous Méthode de score" (également appelée "méthode magique" ). Pour obtenir une liste de toutes les méthodes de dunder avec des explications, consultez notre article sur la feuille de triche de dunder sur ce blog.

Arrière-plan flottant()

float(value) intégré de Python la fonction convertit l'argument value à un nombre flottant. Par exemple, float('42') convertit la valeur de chaîne '42' dans le nombre flottant 42.0 .

Exemple personnalisé __float__()

Dans l'exemple suivant, vous créez une classe personnalisée Data et écrasez le __float__() méthode magique pour qu'elle renvoie un nombre flottant 42.42 en essayant d'appeler le float(x) sur un Data personnalisé objet.

class Data:
    def __float__(self):
        return 42.42


x = Data()
res = float(x) 

print(res)
# 42.42

TypeError :l'argument float() doit être une chaîne ou un nombre, pas '…'

Si vous appelez le float(x) fonction intégrée sans définir le __float__() méthode magique sur un objet donné x , Python lèvera un TypeError :

class Data:
    pass


x = Data()
res = float(x)

Sortie :

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\code.py", line 6, in <module>
    res = float(x)
TypeError: float() argument must be a string or a number, not 'Data'

Pour corriger cette erreur, définissez le x.__float__() méthode pour un objet x avant d'appeler le float(x) intégré méthode :

class Data:
    def __float__(self):
        return 42.42


x = Data()
res = float(x) 

print(res)
# 42.42

TypeError :Data.__float__ a renvoyé une valeur non flottante (type …)

Considérez l'extrait de code suivant où vous essayez de renvoyer une chaîne, c'est-à-dire une valeur non flottante, dans la méthode dunder __float__() :

class Data:
    def __float__(self):
        return '42.42' # not a float!


x = Data()
res = float(x) 

print(res)

L'exécution de cette opération entraîne le message d'erreur suivant sur mon ordinateur :

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\code.py", line 7, in <module>
    res = float(x)
TypeError: Data.__float__ returned non-float (type str)

La raison du TypeError: Data.__float__ returned non-float (type ...) l'erreur est que le __float__() La méthode doit renvoyer une valeur flottante. Donc, pour résoudre l'erreur, renvoyez une valeur flottante comme indiqué précédemment :

class Data:
    def __float__(self):
        return 42.42 # This is a float!


x = Data()
res = float(x) 

print(res)
# 42.42

Méthode de repli __index__() pour float()

Si le __float__() la méthode n'est pas définie sur un objet x sur lequel vous appelez le float(x) , Python tentera d'abord d'appeler x.__index__() méthode pour obtenir une valeur numérique qui pourrait être automatiquement convertie en flottant.

Vous pouvez le voir dans l'exemple suivant où vous remplacez le __index__() méthode en retournant 42 mais pas le __float__() méthode. Le float(x) la méthode fonctionne toujours et renvoie le résultat du __index__() méthode, c'est-à-dire 42.0 .

class Data:
    def __index__(self):
        return 42


x = Data()
res = float(x) 

print(res)
# 42.0

Références :

  • https://docs.python.org/3/reference/datamodel.html