Это унарный оператор (с одним аргументом), заимствованный из C, где все типы данных - это просто разные способы интерпретации байтов. Это операция «инвертировать» или «дополнить», в которой все биты входных данных инвертируются.
В Python для целых чисел биты представления с добавлением в два числа целого числа инвертируются (как в b <- b XOR 1
для каждого отдельного бита), и результат снова интерпретируется как дополнение к двум целое число. Так что для целых чисел ~x
эквивалентно (-x) - 1
.
Реализованная форма оператора ~
предоставляется как operator.invert
. Чтобы поддержать этот оператор в вашем собственном классе, присвойте ему метод __invert__(self)
.
>>> import operator
>>> class Foo:
... def __invert__(self):
... print 'invert'
...
>>> x = Foo()
>>> operator.invert(x)
invert
>>> ~x
invert
Любой класс, в котором имеет смысл иметь «дополнение» или «инверсию» экземпляра, который также является экземпляром того же класса, является возможным кандидатом на оператор инвертирования. Однако перегрузка операторов может привести к путанице при неправильном использовании, поэтому убедитесь, что это действительно имеет смысл, прежде чем предоставлять метод __invert__
вашему классу. (Обратите внимание, что строки байтов [ex: '\xff'
] не поддерживают этот оператор, даже если имеет смысл инвертировать все биты строки байтов.)