Python >> Tutoriel Python >  >> Python

Méthode magique Python __bool__()

Syntaxe

object.__bool__(self)

Le Python __bool__() la méthode implémente le bool() intégré fonction. Ainsi, lorsque vous appelez bool(x) , Python tente d'appeler x.__bool__() . Si la valeur de retour n'est pas un booléen, Python 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 booléen()

bool(x) intégré de Python la fonction convertit la valeur x à une valeur booléenne True ou False . Il utilise la conversion booléenne implicite sur l'argument d'entrée x . Tout objet Python a une valeur de vérité associée.

Le bool(x) La fonction ne prend qu'un seul argument, l'objet pour lequel une valeur booléenne est souhaitée.

Pour comprendre en détail cette opération, n'hésitez pas à relire notre tutoriel ou regarder la vidéo suivante :

Exemple personnalisé __bool__()

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

class Data:
    def __bool__(self):
        return False


x = Data()
res = bool(x)

print(res)
# ... False ...

Si vous n'aviez pas défini le __bool__() méthode, Python aurait utilisé celle par défaut qui renvoie toujours True :

class Data:
    pass


x = Data()
res = bool(x)

print(res)
# ... True ...

TypeError :__bool__ doit renvoyer bool, renvoyé …

Considérez l'extrait de code suivant où vous essayez de renvoyer une valeur de chaîne dans la méthode dunder __bool__() :

class Data:
    def __bool__(self):
        return "42"


x = Data()
res = bool(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 = bool(x)
TypeError: __bool__ should return bool, returned str

La raison de cette erreur est que le __bool__() La méthode doit renvoyer une valeur booléenne. Pour résoudre le n'a jamais été défini, et il n'est pas défini pour un objet personnalisé par défaut. Donc, pour résoudre le TypeError: __bool__ should return bool, returned str , vous devez renvoyer une valeur booléenne dans votre définition de méthode comme indiqué précédemment :

class Data:
    def __bool__(self):
        return True


x = Data()
res = bool(x)

print(res)
# True

Notez qu'une erreur similaire se produit lorsque vous renvoyez d'autres types de données non booléens à partir de __bool__() :

class Data:
    def __bool__(self):
        return 42


x = Data()
res = bool(x)

print(res)

Cela donne :

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\code.py", line 7, in <module>
    res = bool(x)
TypeError: __bool__ should return bool, returned int

Références :

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