Il s'agit d'un opérateur unaire (prenant un seul argument) emprunté au C, où tous les types de données ne sont que des façons différentes d'interpréter les octets. C'est l'opération "inverser" ou "complémenter", dans laquelle tous les bits des données d'entrée sont inversés.
En Python, pour les entiers, les bits de l'élément représentation bi-complémentaire de l'entier sont inversés (comme dans b <- b XOR 1
pour chaque bit individuel), et le résultat est interprété à nouveau comme un entier complémentaire à deux. Donc pour les entiers, ~x
est équivalent à (-x) - 1
.
La forme réifiée de la ~
est fourni en tant qu'opérateur operator.invert
. Pour prendre en charge cet opérateur dans votre propre classe, donnez-lui un numéro d'identification de type __invert__(self)
méthode.
>>> import operator
>>> class Foo:
... def __invert__(self):
... print 'invert'
...
>>> x = Foo()
>>> operator.invert(x)
invert
>>> ~x
invert
Toute classe dans laquelle il est utile d'avoir un "complément" ou un "inverse" d'une instance qui est également une instance de la même classe est un candidat possible pour l'opérateur d'inversion. Cependant, la surcharge d'opérateurs peut mener à la confusion si elle est mal utilisée, alors assurez-vous que cela a vraiment du sens avant de fournir un objet de type __invert__
à votre classe. (Notez que les chaînes d'octets [ex : '\xff'
] ne supportent pas cet opérateur, même s'il est significatif d'inverser tous les bits d'une chaîne d'octets).
22 votes
Notez que l'opérateur de complément unaire
~
mis en œuvre par la méthode spéciale__invert__
n'est pas liée à lanot
qui annule logiquement la valeur renvoyée par l'opérateur__bool__
(ou__nonzero__
en 2.x). Ce n'est pas non plus lié à la-
opérateur de négation unaire, mis en œuvre par__neg__
. Par exemple~True == -2
ce qui n'est pas le cas.False
ou faux, et-False == 0
ce qui est toujours faux.1 votes
@eryksun, bien que ce que vous avez dit soit juste (
-False==0
) C'est déroutant, puisque vous parliez de la~
y~False == -1
ce qui n'est pas faux.3 votes
@GuilhermedeLazari, le deuxième exemple était de comparer avec la négation arithmétique (
__neg__
). J'aurais probablement dû continuer à utiliserTrue
par exemple-True == -1
ce qui n'est pas -2 ouFalse
ou faux, ce qui permet de le relier plus clairement à l'~True
et également que la négation arithmétique d'unbool
est différente de sa négation logique. Je n'essayais pas d'être profond. Je mettais juste en évidence 3 opérations et les méthodes spéciales sous-jacentes qui sont parfois confondues.0 votes
Voir aussi : tutorialspoint.com/python/python_basic_operators.htm --> section "Python Bitwise Operators".