La meilleure façon est probablement d'utiliser l'opérateur not
:
>>> value = True
>>> not value
False
>>> value = False
>>> not value
True
Donc au lieu de votre code:
if bool == True:
return False
else:
return True
Vous pouvez utiliser:
return not bool
La négation logique comme fonction
Il y a aussi deux fonctions dans le operator
module operator.not_
et son alias operator.__not__
au cas où vous en auriez besoin comme fonction plutôt que comme opérateur:
>>> import operator
>>> operator.not_(False)
True
>>> operator.not_(True)
False
Ceux-ci peuvent être utiles si vous souhaitez utiliser une fonction qui nécessite une fonction de prédicat ou un rappel.
Par exemple map
ou filter
:
>>> lst = [True, False, True, False]
>>> list(map(operator.not_, lst))
[False, True, False, True]
>>> lst = [True, False, True, False]
>>> list(filter(operator.not_, lst))
[False, False]
Bien entendu, la même chose pourrait également être obtenue avec une lambda
fonction équivalente :
>>> my_not_function = lambda item: not item
>>> list(map(my_not_function, lst))
[False, True, False, True]
N'utilisez pas l'opérateur d'inversion au niveau du bit ~
sur les booléens
On pourrait être tenté d'utiliser l'opérateur d'inversion au niveau du bit ~
ou la fonction d'opérateur équivalente operator.inv
(ou l'un des 3 autres alias là-bas). Mais comme bool
une sous-classe du int
résultat peut être inattendue car elle ne renvoie pas le "booléen inverse", il renvoie le "entier inverse":
>>> ~True
-2
>>> ~False
-1
C'est parce que True
équivaut à 1
et False
à 0
et que l'inversion au niveau du bit fonctionne sur la représentation au niveau du bit des entiers 1
et 0
.
Donc, ceux-ci ne peuvent pas être utilisés pour "nier" un bool
.
Négation avec les tableaux NumPy (et sous-classes)
Si vous avez affaire à des tableaux NumPy (ou des sous-classes comme pandas.Series
ou pandas.DataFrame
) contenant des booléens, vous pouvez en fait utiliser l'opérateur inverse au niveau du bit ( ~
) pour annuler tous les booléens d'un tableau:
>>> import numpy as np
>>> arr = np.array([True, False, True, False])
>>> ~arr
array([False, True, False, True])
Ou la fonction NumPy équivalente:
>>> np.bitwise_not(arr)
array([False, True, False, True])
Vous ne pouvez pas utiliser l' not
opérateur ou la operator.not
fonction sur les tableaux NumPy car ceux-ci exigent que ceux-ci retournent un seul bool
(pas un tableau de booléens), cependant NumPy contient également une fonction logique non qui fonctionne élément par élément:
>>> np.logical_not(arr)
array([False, True, False, True])
Cela peut également être appliqué aux tableaux non booléens:
>>> arr = np.array([0, 1, 2, 0])
>>> np.logical_not(arr)
array([ True, False, False, True])
Personnaliser vos propres classes
not
fonctionne en appelant bool
la valeur et annule le résultat. Dans le cas le plus simple, la valeur de vérité appellera simplement __bool__
l'objet.
Ainsi, en implémentant __bool__
(ou __nonzero__
en Python 2), vous pouvez personnaliser la valeur de vérité et donc le résultat de not
:
class Test(object):
def __init__(self, value):
self._value = value
def __bool__(self):
print('__bool__ called on {!r}'.format(self))
return bool(self._value)
__nonzero__ = __bool__ # Python 2 compatibility
def __repr__(self):
return '{self.__class__.__name__}({self._value!r})'.format(self=self)
J'ai ajouté une print
déclaration afin que vous puissiez vérifier qu'elle appelle vraiment la méthode:
>>> a = Test(10)
>>> not a
__bool__ called on Test(10)
False
De même, vous pouvez implémenter la __invert__
méthode pour implémenter le comportement lorsqu'il ~
est appliqué:
class Test(object):
def __init__(self, value):
self._value = value
def __invert__(self):
print('__invert__ called on {!r}'.format(self))
return not self._value
def __repr__(self):
return '{self.__class__.__name__}({self._value!r})'.format(self=self)
Encore une fois avec un print
appel pour voir qu'il est effectivement appelé:
>>> a = Test(True)
>>> ~a
__invert__ called on Test(True)
False
>>> a = Test(False)
>>> ~a
__invert__ called on Test(False)
True
Cependant, une __invert__
telle implémentation pourrait être déroutante car son comportement est différent du comportement Python "normal". Si jamais vous faites cela, documentez-le clairement et assurez-vous qu'il a un cas d'utilisation assez bon (et commun).
int
etbool
sont les deux noms de BUILTIN (pour les types qu'ils représentent), et ne doit pas être utilisé comme noms de variables.