Оператор дополнения Python in-place


Python имеет обычный побитовые операторы, как ~, &, |, и т. д. и операторы на месте любят +=, &=, и т.д. чтобы упростить выражения типа:

a = a & 34234
a = a + 577

Кому:

a &= 34234
a += 577

Несмотря на то, что оператор дополнения ~ является унарной функцией и не следует той же структуре, потому что он не используется с двумя значениями (такими как a и 34234), можно ли упростить подобные выражения с помощью другого типа оператора?

a = ~a # not bad at all

# Still easy to code but seems redundant
self.container.longVariableName.longName = ~self.container.longVariableName.longName
2 2

2 ответа:

Это мучительно неясно, но:

self.container.longVariableName.longName ^= -1

Делает свою работу, пока значения, с которыми вы имеете дело, являются целыми числами. "Являются целыми числами" требуется, чтобы между операторами ~ и ^ существовало пригодное для использования математическое отношение.

Почему это работает:

  1. побитовое дополнение - это то же самое, что xor'ING с бесконечной строкой из 1 бита.
  2. Python поддерживает иллюзию, что целые числа используют представление дополнения бесконечной ширины 2, так что -1 "является" бесконечная строка из 1 бита.

Если вы хотите сделать это только для атрибутов экземпляров объектов, вы можете написать такой метод, как:

def c(obj, atr):
    setattr(obj,atr,~getattr(obj,atr))

А затем использовать его следующим образом:

c(self.container.longVariableName, 'longName')

Я думаю, что ответ @TimPeters намного лучше, но подумал, что я предоставлю это на случай, если это будет полезно кому-то в будущем, кому нужно сделать это с нецелыми числами, которые рады работать только с мгновенными атрибутами